web-dev-qa-db-fra.com

Exemples de lignes aléatoires dans le cadre de données

J'ai du mal à trouver la fonction appropriée qui renverrait un nombre spécifié de lignes ramassées de manière aléatoire sans être remplacées par une trame de données en langage R? Quelqu'un peut m'aider?

263
nikhil

D'abord faire des données:

> 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

Puis sélectionnez quelques lignes au hasard:

> 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

La réponse de John Colby est la bonne réponse. Toutefois, si vous êtes un utilisateur dplyr, il existe également la réponse sample_n:

sample_n(df, 10)

échantillonne au hasard 10 lignes de la base de données. Il appelle sample.int, la réponse est donc identique avec moins de saisie (et simplifie l'utilisation dans le contexte de magrittr puisque le cadre de données est le premier argument).

149
kasterma

Écris-en un! Envelopper la réponse de JC me donne:

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

Maintenant, faites mieux en vérifiant d’abord si n <= nrow (df) et en vous arrêtant avec une erreur.

30
Spacedman

Le package data.table fournit la fonction DT[sample(.N, M)], échantillonnant M lignes aléatoires de la table de données 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
25
gented

EDIT: Cette réponse est maintenant obsolète, voir la version mise à jour .

Dans mon paquet R j’ai amélioré sample afin qu’il se comporte maintenant comme prévu également pour les trames de données:

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

Ceci est réalisé en faisant de sample une méthode générique S3 et en fournissant la fonctionnalité nécessaire (triviale) dans une fonction Un appel à setMethod corrige tout. L'implémentation d'origine est toujours accessible via base::sample.

8
krlmlr

Dans mon paquet R , il existe une fonction sample.rows rien que pour cela:

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

Améliorer sample en en faisant une fonction S3 générique était une mauvaise idée, selon les commentaires de Joris Meys à une réponse précédente .

4
krlmlr

Sélectionnez un échantillon aléatoire dans un type de tibble dans R:

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

nrow prend un tibble et renvoie le nombre de lignes. Le premier paramètre passé à sample est compris entre 1 et la fin de votre tibble. Le deuxième paramètre transmis à l'échantillon, 150, est le nombre d'échantillonnages aléatoires souhaités. Le découpage en crochets spécifie les lignes des index renvoyés. La variable 'a' obtient la valeur de l'échantillonnage aléatoire.

4
Eric Leschinski

Je suis nouveau dans R, mais j'utilisais cette méthode simple qui fonctionne pour moi:

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

PS: N'hésitez pas à noter si cela présente un inconvénient auquel je ne pense pas.

0
Leopoldo Sanczyk

Juste pour être complet:

dplyr propose également de prélever une proportion ou une fraction de l’échantillon par

df %>% sample_frac(0.33)

C'est très pratique, par exemple. en apprentissage automatique lorsque vous devez faire un certain ratio tel que 80%: 20%

0
Agile Bean

Vous pourriez faire ceci:

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

Ci-dessus, je viens de faire un cadre de données avec 10 colonnes et 1000 lignes, ok?

Maintenant, vous pouvez le goûter avec 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
0
igorkf