Como tirar muitas amostras de 10 de uma lista grande, sem a necessidade de substituição geral

12

Eu tenho um grande conjunto de dados (20.000 pontos de dados), do qual desejo coletar amostras repetidas de 10 pontos de dados. No entanto, depois de escolher esses 10 pontos de dados, quero que eles não sejam escolhidos novamente.

Eu tentei usar a samplefunção, mas parece não ter uma opção de amostra sem substituição em várias chamadas da função. Existe uma maneira simples de fazer isso?

robintw
fonte

Respostas:

9

Você pode chamar amostra uma vez em todo o conjunto de dados para permutá-lo. Então, quando você quiser obter uma amostra, poderá pegar as 10. primeiras. Se você quiser outra amostra, pegue as 10. seguintes.

Dason
fonte
9

O pensamento de Dason, implementado em R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample
conjugado
fonte
n
@chl Obrigado! Mas acho que vai funcionar. A tarefa era fornecer amostras do tamanho 10 de um conjunto de pontos de dados. Suponha que n = comprimento (pontos de dados). O código fornece o número máximo (n% /% 10) dessas amostras. O primeiro caso de esquina é n <10 (de qualquer maneira descartado na declaração do problema, descrevendo o conjunto de dados como 'grande', ou seja, n> 10). Nesse caso, você recebe os pontos de dados de volta e um aviso (não é um erro). O segundo caso de canto é se houver elementos pendentes (quando n %% 10! = 0). Em seguida, você obtém o maior número possível de amostras e um aviso (não um erro). As situações estranhas são incluídas em um desses dois casos.
conjugadoprior
Parece que o primeiro elemento da lista é do comprimento 11, não 10, e sum(unlist(lapply(sample, length)))retorna o comprimento de datapoints(que eu defini como 1001).
chl
@chl Droga! Você está certo.
conjugateprior
2

Isso deve funcionar:

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)

No entanto, não acho que seja a solução mais elegante ...

Bernd Weiss
fonte
1

@conjugateprior Sua resposta está indo na direção certa. Mas, pelo menos para a minha versão R atual 3.4.3, ela não funciona. No entanto, com alguns ajustes, ele funciona:

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

Como ainda não posso comentar, escolhi responder aqui.

5 ª
fonte