Beispiel zufällige Zeilen innerhalb jeder Gruppe in einer Daten.Tabelle
Wie würden Sie die Daten verwenden.Tabelle effizient nehmen Sie eine Probe von Zeilen innerhalb jeder Gruppe in einen Daten-frame?
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
Ich dachte an etwas wie: DT[ , sample(??, 3), by = a]
zurückgeben würde eine Probe von drei Zeilen für jedes "a" (die Reihenfolge der zurückgegebenen Zeilen ist nicht signifikant):
a b
1: 2 180
2: 2 57
3: 2 799
4: 1 69
5: 1 347
6: 1 732
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht so etwas?
(Dank an Josh für die Korrektur, unten).
DT[, sample(b, 3), by=a]
(außer bei Namen)DT[DT[, sample(.I, 3), by=a][[2]],]
. (sample(.I,3)
Proben Zeile zahlen relativ zuDT
). Dieser Aufruf ist von Vorteil ist, dass es nicht erforderlich, dass jede Teilmenge.SD
werden vollständig aufgefüllt, wie der Ruf verarbeitet wird.if
- Anweisung bedingte änderung der Anzahl der Proben zurückgegeben, für jede Gruppe, basierend auf dem Wert vona
:DT[,.SD[sample(.N, if(a == 1) 2 else 3)],by = a]
sample
auf.I
wenn es passiert, dass die Gruppierung ergibt nur eine Zeile kann zu unvorhergesehenen Ergebnissen führen. In solchen Fällen.I
enthält nur ein integer-Wert (die position der Zeile in DT) undsample
verhält sich anders als bei der fed mit einem Vektor. Die soltunionDT[DT[ , .I[sample(.N,3)] , by = a]$V1]
wie vorgeschlagen, here durch @akrun könnte es zu beheben.sample(2,3)
um zu sehen, was ich meine.) Ich habe es jetzt behoben, mit einem Update, das sollte vermutlich auch angewendet werden, um die von Ihnen vorgeschlagene Lösung. Vielen Dank für Ihren Kommentar!Ich glaube, dass joran Antwort kann weiter verallgemeinert. Die details sind hier (Wie stellen Sie sample-Gruppen in Daten.Tabelle mit VORBEHALT) aber ich glaube, diese Lösung Konten für Fälle, wo es nicht die "3" Zeilen, die Probe aus.
Die aktuelle Lösung Fehler aus, wenn versucht wird, die Probe "x" - Zeiten aus den Zeilen, die weniger als "x" gemeinsame Werte. In der unten Fall x=3. Und es berücksichtigt, dass dieser VORBEHALT. (Die Lösung geschieht durch nrussell)
Inspiriert von diese Antwort von David Arenburg, eine andere Methode zu vermeiden, die
.SD
Aufteilung wäre zum Beispiel die Gruppen, dann kommen Sie wieder auf die ursprünglichen Daten mit.EACHI
wo die
DT[, sample(.N, 3), by=a]
Linie gibt uns ein Beispiel für jede Gruppealso wir können dann
V1
zu geben, uns dieb
entspricht.Stratified sampling > oversampling