Wie man viele 10er-Proben aus einer großen Liste entnimmt, ohne sie insgesamt zu ersetzen

12

Ich habe einen großen Datensatz (20.000 Datenpunkte), aus dem ich wiederholt Stichproben von 10 Datenpunkten entnehmen möchte. Sobald ich diese 10 Datenpunkte ausgewählt habe, möchte ich, dass sie nicht erneut ausgewählt werden.

Ich habe versucht, die sampleFunktion zu verwenden, aber es scheint keine Option zu geben, über mehrere Aufrufe der Funktion ersatzlos zu testen. Gibt es eine einfache Möglichkeit, dies zu tun?

robintw
quelle

Antworten:

9

Sie können sample einmal für den gesamten Datensatz aufrufen, um ihn zu permutieren. Wenn Sie dann eine Probe erhalten möchten, können Sie die ersten 10 nehmen. Wenn Sie eine andere Probe möchten, nehmen Sie die nächsten 10. So weiter und so fort.

Dason
quelle
9

Dasons Gedanke, umgesetzt in R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample
Konjugatprior
quelle
n
@chl Danke! Aber ich denke es wird funktionieren. Die Aufgabe bestand darin, Proben der Größe 10 aus einem Satz von Datenpunkten zu geben. Angenommen, n = Länge (Datenpunkte). Der Code gibt die maximale Anzahl (n% /% 10) solcher Proben an. Der erste Eckfall ist n <10 (in der Problemstellung ohnehin ausgeschlossen, indem der Datensatz als 'groß' beschrieben wird, dh n> 10). In diesem Fall erhalten Sie die Datenpunkte zurück und eine Warnung (kein Fehler). Der zweite Eckfall ist, wenn baumelnde Elemente vorhanden sind (wenn n %% 10! = 0). Dann erhalten Sie so viele Proben wie möglich und eine Warnung (kein Fehler). In einem dieser beiden Fälle werden ungerade n Situationen zusammengefasst.
Conjugateprior
Es scheint, dass das erste Element der Liste die Länge 11 und nicht 10 hat und sum(unlist(lapply(sample, length)))die Länge von datapoints(die ich auf 1001 gesetzt habe) zurückgibt.
Chl
@chl Verdammt! Du liegst richtig.
Conjugateprior
2

Das sollte funktionieren:

x <- rnorm(20000)
x.copy <- x
samples <- list()
i <- 1
while (length(x) >= 10){
    tmp <- sample(x, 10)
    samples[[i]] <- tmp
    i <- i+1
    x <- x[-match(tmp, x)]
}

table(unlist(samples) %in% x.copy)

Ich denke jedoch nicht, dass dies die eleganteste Lösung ist ...

Bernd Weiss
quelle
1

@conjugateprior Deine Antwort geht in die richtige Richtung. Aber zumindest für meine aktuelle R-Version 3.4.3 funktioniert es nicht. Mit einigen Optimierungen funktioniert es jedoch:

mysample<-split(sample(length(datapoints)), 1:10)
mysample[[9]] ## the ninth sample

Da ich noch keinen Kommentar abgeben kann, habe ich mich entschieden, hier zu antworten.

5 ..
quelle