Cómo tomar muchas muestras de 10 de una lista grande, sin reemplazo general

12

Tengo un gran conjunto de datos (20,000 puntos de datos), de los cuales quiero tomar muestras repetidas de 10 puntos de datos. Sin embargo, una vez que haya elegido esos 10 puntos de datos, quiero que no se vuelvan a seleccionar.

Intenté usar la samplefunción, pero no parece tener una opción para probar sin reemplazar varias llamadas de la función. ¿Hay una manera simple de hacer esto?

robintw
fuente

Respuestas:

9

Puede llamar a sample una vez en todo el conjunto de datos para permutarlo. Luego, cuando desee obtener una muestra, puede tomar los primeros 10. Si desea otra muestra, tome los siguientes 10. Así sucesivamente.

Razón
fuente
9

El pensamiento de Dason, implementado en R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample
conjugadoprior
fuente
(+1) Código R realmente limpio. Cabe destacar que no funcionará si es impar. n
chl
@chl Gracias! Pero creo que funcionará. La tarea consistía en dar muestras de tamaño 10 a partir de un conjunto de puntos de datos. Suponga n = longitud (puntos de datos). El código proporciona el número máximo (n% /% 10) de tales muestras. El primer caso de esquina es n <10 (de todos modos se descarta en la declaración del problema al describir el conjunto de datos como 'grande', es decir, n> 10). En ese caso, recupera los puntos de datos y una advertencia (no un error). El segundo caso de esquina es si hay elementos colgantes (cuando n %% 10! = 0). Luego obtienes tantas muestras como sea posible y una advertencia (no un error). Las situaciones impares se subsumen en uno de estos dos casos.
conjugateprior
Parece que el primer elemento de la lista es de longitud 11, no 10, y sum(unlist(lapply(sample, length)))devuelve la longitud de datapoints(que configuré en 1001).
chl
@chl ¡Maldición! Tienes toda la razón.
conjugateprior
2

Esto debería 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)

Sin embargo, no creo que sea la solución más elegante ...

Bernd Weiss
fuente
1

@conjugateprior Su respuesta va en la dirección correcta. Pero al menos para mi versión R actual 3.4.3, no funciona. Sin embargo, con algunos ajustes funciona:

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

Como todavía no puedo comentar, elegí responder aquí.

5to
fuente