Jak pobrać wiele próbek 10 z dużej listy, bez ogólnej wymiany

12

Mam duży zestaw danych (20 000 punktów danych), z których chcę pobrać powtarzane próbki 10 punktów danych. Jednak po wybraniu tych 10 punktów danych chcę, aby nie były ponownie wybierane.

Próbowałem użyć tej samplefunkcji, ale wydaje się, że nie ma opcji próbkowania bez zamiany przez wiele wywołań funkcji. Czy istnieje prosty sposób to zrobić?

robintw
źródło

Odpowiedzi:

9

Możesz raz wywołać próbkę dla całego zestawu danych, aby ją zezwolić. Następnie, gdy chcesz pobrać próbkę, możesz wziąć pierwszą 10. Jeśli chcesz kolejną próbkę, złap następną 10. Tak dalej i tak dalej.

Dason
źródło
9

Myśl Dason, zaimplementowana w R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample
sprzężonyprior
źródło
(+1) Naprawdę fajny kod R. Warto zauważyć, że nie zadziała, jeśli jest nieparzyste. n
chl
@chl Thanks! Ale myślę, że to zadziała. Zadanie polegało na podaniu próbek o rozmiarze 10 z zestawu punktów danych. Załóżmy, że n = długość (punkty danych). Kod podaje maksymalną liczbę (n% /% 10) takich próbek. Pierwszy przypadek narożny to n <10 (zresztą wykluczone w opisie problemu przez opisanie zestawu danych jako „dużego”, tj. N> 10). W takim przypadku otrzymasz punkty danych i ostrzeżenie (nie błąd). Drugi przypadek narożny dotyczy wiszących elementów (gdy n %% 10! = 0). Następnie otrzymasz jak najwięcej próbek i ostrzeżenie (nie błąd). Sytuacje nieparzyste są uwzględniane w jednym z tych dwóch przypadków.
conjugateprior
Wydaje się, że pierwszy element listy ma długość 11, a nie 10, i sum(unlist(lapply(sample, length)))zwraca długość datapoints(której ustawiłem na 1001).
chl
@chl Damn! Masz w zasadzie rację.
conjugateprior
2

To powinno działać:

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)

Nie sądzę jednak, aby to było najbardziej eleganckie rozwiązanie ...

Bernd Weiss
źródło
1

@conjugateprior Twoja odpowiedź zmierza w dobrym kierunku. Ale przynajmniej dla mojej obecnej wersji R 3.4.3 nie działa. Jednak z pewnymi poprawkami działa:

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

Ponieważ nie mogę jeszcze komentować, postanowiłem tutaj odpowiedzieć.

5.
źródło