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ć?

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.


9

Myśl Dason, zaimplementowana w R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample

(+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 ...


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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.