web-dev-qa-db-ger.com

Stichprobenzeilen in Dataframe

Ich habe Schwierigkeiten, die geeignete Funktion zu finden, die eine bestimmte Anzahl von Zeilen zurückgibt, die zufällig aus einem Datenrahmen in der Sprache R abgerufen wurden. Kann mir jemand helfen?

263
nikhil

Machen Sie zuerst einige Daten:

> 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

Wählen Sie dann einige Zeilen zufällig aus:

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

Die Antwort, die John Colby gibt, ist die richtige Antwort. Wenn Sie jedoch dplyr sind, gibt es auch die Antwort sample_n:

sample_n(df, 10)

entnimmt zufällig 10 Zeilen aus dem Datenrahmen. Es ruft sample.int auf, also ist es wirklich die gleiche Antwort mit weniger Tippaufwand (und vereinfacht die Verwendung im Kontext von magrittr, da der Datenrahmen das erste Argument ist).

149
kasterma

Schreibe einen! JCs Antwort einzuwickeln, gibt mir:

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

Machen Sie es jetzt besser, indem Sie zunächst prüfen, ob n <= nrow (df) ist und mit einem Fehler anhalten.

30
Spacedman

Das Paket data.table stellt die Funktion DT[sample(.N, M)] bereit, die M zufällige Zeilen aus der Datentabelle DT abtastet.

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
25
gented

EDIT: Diese Antwort ist veraltet, siehe aktualisierte Version .

In mein R-Paket habe ich sample so verbessert, dass es sich jetzt auch für Datenrahmen wie erwartet verhält:

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

Dies ist erreicht , indem sample eine generische S3-Methode wird und die erforderliche (triviale) Funktionalität in einer Funktion bereitgestellt wird. Ein Aufruf von setMethod behebt alles. Auf die ursprüngliche Implementierung kann weiterhin über base::sample zugegriffen werden.

8
krlmlr

In mein R-Paket gibt es zu diesem Zweck eine Funktion sample.rows:

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

Die Verbesserung von sample durch eine generische S3-Funktion war laut Kommentaren von Joris Meys zu einer vorherigen Antwort eine schlechte Idee.

4
krlmlr

Wähle ein Zufallsmuster aus einem Tibbeltyp in R:

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

nrow nimmt ein Zeichen und gibt die Anzahl der Zeilen zurück. Der erste Parameter, der an sample übergeben wird, ist ein Bereich von 1 bis zum Ende Ihrer Tabelle. Der zweite Parameter, der an Sample 150 übergeben wird, gibt an, wie viele Stichproben Sie wünschen. In der eckigen Klammer werden die Zeilen der zurückgegebenen Indizes angegeben. Die Variable 'a' liefert den Wert der Zufallsstichprobe.

4
Eric Leschinski

Der Vollständigkeit halber:

dplyr bietet auch an, einen Anteil oder Bruchteil der Stichprobe durch zu ziehen

df %>% sample_frac(0.33)

Dies ist sehr praktisch, z.B. im maschinellen Lernen, wenn Sie ein bestimmtes Aufteilungsverhältnis wie 80%: 20% tun müssen

1
Agile Bean

Ich bin neu in R, aber ich habe diese einfache Methode verwendet, die für mich funktioniert:

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

PS: Fühlen Sie sich frei zu bemerken, wenn es einen Nachteil hat, an den ich nicht denke.

0

Sie könnten das tun:

library(tidyverse)

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

Oben habe ich gerade einen Datenrahmen mit 10 Spalten und 1000 Zeilen gemacht, ok?

Jetzt können Sie es mit sample_n probieren:

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
0
igorkf