Échantillon aléatoire de lignes à l'intérieur de chaque groupe de données.table
Comment voudriez-vous d'utiliser les données.tableau efficacement prendre un échantillon de lignes à l'intérieur de chaque groupe dans un bloc de données?
DT = data.table(a = sample(1:2), b = sample(1:1000,20))
DT
a b
1: 2 562
2: 1 183
3: 2 180
4: 1 874
5: 2 533
6: 1 21
7: 2 57
8: 1 20
9: 2 39
10: 1 948
11: 2 799
12: 1 893
13: 2 993
14: 1 69
15: 2 906
16: 1 347
17: 2 969
18: 1 130
19: 2 118
20: 1 732
Je pensais à quelque chose comme: DT[ , sample(??, 3), by = a]
qui permettrait le retour d'un échantillon de trois lignes pour chaque "un" (l'ordre des lignes renvoyées n'est pas significatif):
a b
1: 2 180
2: 2 57
3: 2 799
4: 1 69
5: 1 347
6: 1 732
Vous devez vous connecter pour publier un commentaire.
Peut-être quelque chose comme ça?
(Merci à Josh pour la correction ci-dessous).
DT[, sample(b, 3), by=a]
(sauf pour les noms)DT[DT[, sample(.I, 3), by=a][[2]],]
. (sample(.I,3)
échantillons de numéros de ligne par rapport àDT
). Cet appel de l'avantage, c'est qu'elle n'exige pas que chaque sous-ensemble.SD
être entièrement peuplée que l'appel est traité.if
instruction conditionnelle, modifier le nombre d'échantillons retournée pour chaque groupe basé sur la valeur dea
:DT[,.SD[sample(.N, if(a == 1) 2 else 3)],by = a]
sample
sur.I
quand il arrive que le regroupement des rendements de seulement une ligne peut donner des résultats inattendus. Dans de tels cas.I
ne contient qu'un nombre entier (de la position de ligne en DT) etsample
se comporte différemment que lorsque nourris avec un vecteur. Le soltunionDT[DT[ , .I[sample(.N,3)] , by = a]$V1]
proposé here par @akrun pourrait le réparer.sample(2,3)
pour voir ce que je veux dire.) J'ai corrigé maintenant, à l'aide d'un correctif qui devrait probablement être appliquée à la solution proposée. Merci pour votre commentaire!Je crois joran de réponse peut être plus généralisée. Les détails sont ici (Comment pensez-vous de l'échantillon des groupes dans les données.tableau avec une mise en garde) mais je pense que cette solution de comptes pour les cas où il n'y a pas de "3" lignes de échantillon de.
La situation actuelle sera d'erreur lorsqu'il tente de l'échantillon "x" fois à partir de lignes qui ont moins de "x" valeurs communes. Dans le cas ci-dessous, x=3. Et il tient compte de cette mise en garde. (Solution fait par nrussell)
Inspiré par cette réponse par David Arenburg, une autre méthode pour éviter le
.SD
allocation serait de l'échantillon les groupes, puis rejoindre à l'arrière sur les données d'origine à l'aide de.EACHI
où la
DT[, sample(.N, 3), by=a]
ligne nous donne un échantillon pour chaque groupede sorte que nous pouvons utiliser
V1
pour nous donner lab
il correspond.l'échantillonnage Stratifié > suréchantillonnage