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?

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.


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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.