J'ai du mal à trouver la fonction appropriée qui retournerait un nombre spécifié de lignes ramassées au hasard sans remplacement à partir d'une trame de données en langage R? Quelqu'un peut m'aider?
333
Faites d'abord quelques 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
Sélectionnez ensuite 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
?sample
dans la console R pour en savoir plus sur cette fonction.set.seed(42)
) chaque fois que vous souhaitez reproduire cet échantillon spécifique.sample.int
serait un peu plus rapide je crois:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
La réponse que John Colby donne est la bonne réponse. Cependant, si vous êtes un
dplyr
utilisateur, il y a aussi la réponsesample_n
:échantillonne au hasard 10 lignes de la trame de données. Il appelle
sample.int
, donc c'est vraiment la même réponse avec moins de frappe (et simplifie l'utilisation dans le contexte de magrittr puisque le dataframe est le premier argument).la source
Écrivez-en un! Envelopper la réponse de JC me donne:
Améliorez-le maintenant en vérifiant d'abord si n <= nrow (df) et en vous arrêtant avec une erreur.
la source
Le
data.table
package fournit la fonctionDT[sample(.N, M)]
, échantillonnant M lignes aléatoires de la table de donnéesDT
.la source
Par souci d'exhaustivité:
dplyr propose également de prélever une proportion ou une fraction de
C'est très pratique, par exemple dans l'apprentissage automatique lorsque vous devez faire un certain rapport de partage comme 80%: 20%
la source
EDIT : Cette réponse est désormais obsolète, voir la version mise à jour .
Dans mon package R, j'ai amélioré
sample
pour qu'il se comporte maintenant comme prévu également pour les trames de données:Ceci est réalisé en créant
sample
une méthode générique S3 et en fournissant la fonctionnalité nécessaire (triviale) dans une fonction. Un appel àsetMethod
tout réparer. L'implémentation d'origine est toujours accessible viabase::sample
.la source
sample.default(df, ...)
une trame de donnéesdf
, elle échantillonne à partir des colonnes de la trame de données, car une trame de données est implémentée comme une liste de vecteurs de la même longueur.install_github('kimisc', 'krlmlr')
et j'ai réussiError: Does not appear to be an R package (no DESCRIPTION)
. Quelque chose autour de ça?[
opérateur pour les trames de données est un contre-exemple. Aussi, dites-moi s'il vous plaît: Avez-vous déjà, une seule fois, utilisésample
pour échantillonner des colonnes d'une trame de données?iris[2]
fonctionne comme une liste, tout commeiris[[2]]
. Ouiris$Species
,lapply(iris, mean)
... les trames de données sont des listes. Je m'attends donc à ce qu'ils se comportent comme eux. Et oui, j'ai en fait utilisé sample (myDataframe). Sur un ensemble de données où chaque variable contient des données d'expression d'un seul gène. Votre méthode spécifique aide les utilisateurs novices, mais change également efficacement lesample()
comportement. Remarque J'utilise "comme prévu" du point de vue d'un programmeur. Ce qui est différent de l'intuition générale. Il y a beaucoup dans R qui n'est pas compatible avec l'intuition générale ...;)Dans mon package R, il y a une fonction
sample.rows
juste à cet effet:L'amélioration en
sample
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 .la source
Sélectionnez un échantillon aléatoire dans un type de tibble dans R:
nrow prend un tibble et retourne le nombre de lignes. Le premier paramètre transmis à
sample
est une plage de 1 à la fin de votre tibble. Le deuxième paramètre transmis à l'échantillon, 150, est le nombre d'échantillons aléatoires que vous souhaitez. Le découpage entre crochets spécifie les lignes des indices renvoyés. La variable «a» obtient la valeur de l'échantillonnage aléatoire.la source
Vous pouvez faire ceci:
Ci-dessus, je viens de créer une trame de données avec 10 colonnes et 100 lignes, d'accord?
Vous pouvez maintenant l'échantillonner avec
sample_n
:la source
Je suis nouveau dans R, mais j'utilisais cette méthode simple qui fonctionne pour moi:
PS: N'hésitez pas à noter s'il y a un inconvénient auquel je ne pense pas.
la source
Vous pouvez faire ceci:
la source