2016-05-03 1 views
0

Ich habe Datensätze mit 1 bis 70 Spalten mit Daten mit 1 bis 5 Spalten mit ID-Variablen. Ich muss nach den ID-Variablen gruppieren und dann zufällig Blöcke von Zeilen innerhalb einer ID-Variablen abtasten. Der erneut abgetastete Datensatz muss dieselbe Länge wie der ursprüngliche Datensatz haben.dplyr: Zufallsauswahlverfahren für Zeilenblöcke (mehrere Gruppierungsvariablen und Datenspalten)

Unten ist und Beispiel DATA mit der gewünschten Tabelle RESULT gesetzt. Also, ich muss nach SITE und DATE gruppieren und dann zufällig den Block von drei Zeilen (aqu, n/a, terr) mit jedem INDIV verbundenen Stichprobe. Bitte beachten Sie, wie die CATEGORY Bestellung in der Tabelle RESULT (z. B. aqu, n/a, terr) beibehalten wird.

Ich brauche dplyr zu verwenden, da diese Zufallsstichprobenverfahren Daten in eine größere for Schleife-Feeds, die dplyr Funktionen für verschiedene Berechnungen verwendet ... .und wie viele von Ihnen wissen dplyr Masken verschiedene Funktionen in anderen Paketen. Ich entschuldige mich für das Kopieren und Einfügen von Rohtabellen in diese Frage, aber dies war der einfachste Weg, die Komplexität meines Datensatzes zu replizieren. Danke im Voraus.

DATA

SITE DATE INDIV CATEGORY BIOMASS LENGTH 
GC Oct A aqu 0.0002 10 
GC Oct A n/a 0 0 
GC Oct A terr 0 0 
GC Oct B aqu 0 0 
GC Oct B n/a 0 0 
GC Oct B terr 0 0 
GC Oct C aqu 0.1875 20 
GC Oct C n/a 0 0 
GC Oct C terr 0.5424 30 
GC Aug D aqu 7.4888 10 
GC Aug D n/a 0 0 
GC Aug D terr 100.9245 5 
GC Aug E aqu 0.0001 1 
GC Aug E n/a 0 0 
GC Aug E terr 0 0 
GC Aug F aqu 0 0 
GC Aug F n/a 0 0 
GC Aug F terr 20.593 10 
NSVhi Oct A aqu 5.8713 5 
NSVhi Oct A n/a 0 0 
NSVhi Oct A terr 13.8651 3 
NSVhi Oct B aqu 17.2288 2 
NSVhi Oct B n/a 0 0 
NSVhi Oct B terr 0 0 
NSVhi Oct C aqu 22.7558 1 
NSVhi Oct C n/a 0 0 
NSVhi Oct C terr 24.7843 6 
NSVhi Aug D aqu 0 0 
NSVhi Aug D n/a 0 0 
NSVhi Aug D terr 31.9222 7 
NSVhi Aug E aqu 0.046 10 
NSVhi Aug E n/a 0 0 
NSVhi Aug E terr 0 0 
NSVhi Aug F aqu 2.1156 5 
NSVhi Aug F n/a 0 0 
NSVhi Aug F terr 0 0 

RESULT

SITE DATE INDIV CATEGORY BIOMASS LENGTH 
GC Oct C aqu 0.1875 20 
GC Oct C n/a 0 0 
GC Oct C terr 0.5424 30 
GC Oct C aqu 0.1875 20 
GC Oct C n/a 0 0 
GC Oct C terr 0.5424 30 
GC Oct A aqu 0.0002 10 
GC Oct A n/a 0 0 
GC Oct A terr 0 0 
GC Aug D aqu 7.4888 10 
GC Aug D n/a 0 0 
GC Aug D terr 100.9245 5 
GC Aug F aqu 0 0 
GC Aug F n/a 0 0 
GC Aug F terr 20.593 10 
GC Aug D aqu 7.4888 10 
GC Aug D n/a 0 0 
GC Aug D terr 100.9245 5 
NSVhi Oct B aqu 17.2288 2 
NSVhi Oct B n/a 0 0 
NSVhi Oct B terr 0 0 
NSVhi Oct C aqu 22.7558 1 
NSVhi Oct C n/a 0 0 
NSVhi Oct C terr 24.7843 6 
NSVhi Oct A aqu 5.8713 5 
NSVhi Oct A n/a 0 0 
NSVhi Oct A terr 13.8651 3 
NSVhi Aug D aqu 0 0 
NSVhi Aug D n/a 0 0 
NSVhi Aug D terr 31.9222 7 
NSVhi Aug D aqu 0 0 
NSVhi Aug D n/a 0 0 
NSVhi Aug D terr 31.9222 7 
NSVhi Aug D aqu 0 0 
NSVhi Aug D n/a 0 0 
NSVhi Aug D terr 31.9222 7 

Antwort

1

Das klingt wie das, was Sie vielleicht ....

library(dplyr) 
dat <- group_by(DATA, SAMPLE, CATEGORY) 
sample_df <- distinct(sample_n(dat, 3, replace = T)) 

Aber ich denke, das macht mehr Sinn ...

dat <- group_by(DATA, CATEGORY) 
sample_df <- sample_n(dat, 3) 

Dann wieder weiß ich nicht genau was Sie wollen. Hoffe das hilft.

1

In data.table:

library(data.table) 
setDT(DATA, key = "SAMPLE") 

set.seed(12030) 
DATA[.(sample(unique(SAMPLE), rep = TRUE))] 
# SAMPLE CATEGORY BIOMASS 
# 1:  B  1  10 
# 2:  B  2  10 
# 3:  B  3  10 
# 4:  B  1  10 
# 5:  B  2  10 
# 6:  B  3  10 
# 7:  A  1  1 
# 8:  A  2  1 
# 9:  A  3  1 

Wenn Sie Bootstrapping (Ich vermute, Sie sind) und planen dies viele Male zu wiederholen, wird es effizienter sein, Ihre Randomisierung Blöcke zuweisen zuerst:

RB <- DATA[ , unique(SAMPLE)] 
#repeat BB times 
replicate(BB, DATA[.(sample(RB, rep = TRUE))]) 
+0

Danke Michael! Nach dem Lesen der Antworten wurde mir jedoch klar, dass meine ursprüngliche Frage nicht die Komplexität meines Problems widerspiegelte. Alle Lösungen für die aktualisierte Frage sind willkommen. Pass auf. – Vesuccio

+0

@Vesuccio Anstelle von 'RB <- DATA [, unique (SAMPLE)]', mache 'RB <- unique (DATA [,. (SITE, DATE)])' und statt 'DATE [. ...)) ', do' DATA [RB [Beispiel (.N, rep = TRUE)], ..., on = c ("SITE", "DATUM")] '... Ich bin nicht 100 Sicher, das wird funktionieren, aber ich mag es nicht, dass du die Frage umgedreht hast und meine Antwort annulliert hast. – MichaelChirico

+0

Entschuldigung, Michael. Ich habe nicht nachgedacht. Ich hätte nur eine neue Frage stellen sollen. Danke für deine Zeit. – Vesuccio

Verwandte Themen