Voorbeeld van willekeurige rijen in dataframe

Ik heb moeite om de juiste functie te vinden die een bepaald aantal willekeurig opgehaalde rijen zou retourneren zonder vervanging van een dataframe in R-taal? Kan iemand me helpen?


Antwoord 1, autoriteit 100%

Maak eerst wat gegevens:

> df = data.frame(matrix(rnorm(20), nrow=10))
> df
           X1         X2
1   0.7091409 -1.4061361
2  -1.1334614 -0.1973846
3   2.3343391 -0.4385071
4  -0.9040278 -0.6593677
5   0.4180331 -1.2592415
6   0.7572246 -0.5463655
7  -0.8996483  0.4231117
8  -1.0356774 -0.1640883
9  -0.3983045  0.7157506
10 -0.9060305  2.3234110

Selecteer vervolgens willekeurig enkele rijen:

> df[sample(nrow(df), 3), ]
           X1         X2
9  -0.3983045  0.7157506
2  -1.1334614 -0.1973846
10 -0.9060305  2.3234110

Antwoord 2, autoriteit 48%

Het antwoord dat John Colby geeft, is het juiste antwoord. Als u echter een dplyr-gebruiker bent, is er ook het antwoord sample_n:

sample_n(df, 10)

steek willekeurig 10 rijen uit het dataframe op. Het roept sample.intaan, dus eigenlijk hetzelfde antwoord met minder typen (en vereenvoudigt het gebruik in de context van magrittr aangezien het dataframe het eerste argument is).


Antwoord 3, autoriteit 8%

Het pakket data.tablebiedt de functie DT[sample(.N, M)], waarbij M willekeurige rijen worden bemonsterd uit de gegevenstabel DT.

library(data.table)
set.seed(10)
mtcars <- data.table(mtcars)
mtcars[sample(.N, 6)]
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1: 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
2: 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
3: 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
4: 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
5: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
6: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2

Antwoord 4, autoriteit 7%

Schrijf er een! Het antwoord van JC inpakken geeft me:

randomRows = function(df,n){
   return(df[sample(nrow(df),n),])
}

Maak het nu beter door eerst te controleren of n<=nrow(df) en te stoppen met een fout.


Antwoord 5, autoriteit 3%

Voor de volledigheid:

dplyr biedt ook aan om een ​​deel of fractie van het monster te tekenen door

df %>% sample_frac(0.33)

Dit is erg handig, b.v. in machine learning wanneer je een bepaalde splitsingsverhouding moet doen, zoals 80%:20%


Antwoord 6, autoriteit 2%

BEWERKEN: dit antwoord is nu verouderd, zie de bijgewerkte versie.

In mijn R-pakketheb ik sampleverbeterd zodat het gedraagt ​​zich nu ook zoals verwacht voor dataframes:

library(devtools); install_github('kimisc', 'krlmlr')
library(kimisc)
example(sample.data.frame)
smpl..> set.seed(42)
smpl..> sample(data.frame(a=c(1,2,3), b=c(4,5,6),
                           row.names=c('a', 'b', 'c')), 10, replace=TRUE)
    a b
c   3 6
c.1 3 6
a   1 4
c.2 3 6
b   2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6

Dit is bereiktdoor sampleeen S3 generieke methode en het voorzien van de nodige (triviale) functionaliteit in een functie. Een aanroep van setMethodlost alles op. De originele implementatie is nog steeds toegankelijk via base::sample.


Antwoord 7, autoriteit 2%

Verouderd antwoord. Gebruik in plaats daarvan dplyr::sample_frac()of dplyr::sample_n().

In mijn R-pakketis er een functie sample.rowsalleen voor dit doel:

install.packages('kimisc')
library(kimisc)
example(sample.rows)
smpl..> set.seed(42)
smpl..> sample.rows(data.frame(a=c(1,2,3), b=c(4,5,6),
                               row.names=c('a', 'b', 'c')), 10, replace=TRUE)
    a b
c   3 6
c.1 3 6
a   1 4
c.2 3 6
b   2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6

Het verbeteren van sampledoor er een generieke S3-functie van te maken was een slecht idee, volgens opmerkingen van Joris Meys op een vorige antwoord.


Antwoord 8, autoriteit 2%

Je zou dit kunnen doen:

library(dplyr)
cols <- paste0("a", 1:10)
tab <- matrix(1:1000, nrow = 100) %>% as.tibble() %>% set_names(cols)
tab
# A tibble: 100 x 10
      a1    a2    a3    a4    a5    a6    a7    a8    a9   a10
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1     1   101   201   301   401   501   601   701   801   901
 2     2   102   202   302   402   502   602   702   802   902
 3     3   103   203   303   403   503   603   703   803   903
 4     4   104   204   304   404   504   604   704   804   904
 5     5   105   205   305   405   505   605   705   805   905
 6     6   106   206   306   406   506   606   706   806   906
 7     7   107   207   307   407   507   607   707   807   907
 8     8   108   208   308   408   508   608   708   808   908
 9     9   109   209   309   409   509   609   709   809   909
10    10   110   210   310   410   510   610   710   810   910
# ... with 90 more rows

Hierboven heb ik zojuist een dataframe gemaakt met 10 kolommen en 100 rijen, oké?

Je kunt het nu samplen met sample_n:

sample_n(tab, size = 800, replace = T)
# A tibble: 800 x 10
      a1    a2    a3    a4    a5    a6    a7    a8    a9   a10
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1    53   153   253   353   453   553   653   753   853   953
 2    14   114   214   314   414   514   614   714   814   914
 3    10   110   210   310   410   510   610   710   810   910
 4    70   170   270   370   470   570   670   770   870   970
 5    36   136   236   336   436   536   636   736   836   936
 6    77   177   277   377   477   577   677   777   877   977
 7    13   113   213   313   413   513   613   713   813   913
 8    58   158   258   358   458   558   658   758   858   958
 9    29   129   229   329   429   529   629   729   829   929
10     3   103   203   303   403   503   603   703   803   903
# ... with 790 more rows

Antwoord 9

Selecteer een willekeurige steekproef uit een tibble-type in R:

library("tibble")    
a <- your_tibble[sample(1:nrow(your_tibble), 150),]

nrow neemt een tibble en geeft het aantal rijen terug. De eerste parameter die aan samplewordt doorgegeven, is een bereik van 1 tot het einde van je tibble. De tweede parameter die wordt doorgegeven aan steekproef, 150, is hoeveel willekeurige steekproeven u wilt. De slicing met vierkante haakjes specificeert de rijen van de indices die worden geretourneerd. Variabele ‘a’ krijgt de waarde van de willekeurige steekproef.


Antwoord 10

Ik ben nieuw in R, maar ik gebruikte deze eenvoudige methode die voor mij werkt:

sample_of_diamonds <- diamonds[sample(nrow(diamonds),100),]

PS: Voel je vrij om op te merken als het een nadeel heeft waar ik niet aan denk.


Antwoord 11

Je zou dit kunnen doen:

sample_data = data[sample(nrow(data), sample_size, replace = FALSE), ]

Other episodes