seleccionar - ¿Cómo se extraen algunas filas aleatorias de una tabla de datos sobre la marcha?
seleccionar datos aleatorios en excel (3)
Tengo una tabla de datos grande (alrededor de 24000 filas y creciendo). Quiero subcontratar esa base de datos en función de un par de criterios y de ese subconjunto (termina siendo aproximadamente 3000 filas) Quiero muestrear aleatoriamente solo 4 filas. No quiero crear una tabla de datos de más o menos 3000 nombres, contar sus filas y luego muestrear en función del número de fila. ¿Cómo puedo hacerlo sobre la marcha? ¿O debería simplemente absorberlo creando la tabla y luego trabajando en ella, probándola y luego usando rm()
para deshacerme de ella?
Vamos a simular mi problema
require(data.table)
random.length <- sample(x = 15:30, size = 1)
data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))
Eso hace una tabla de longitud aleatoria, que simula el hecho de que, dependiendo de mis criterios y de mi tabla de inicio, no sé cuál es la longitud de la tabla subcontratada con be
Ahora, si solo quisiera las primeras tres filas, podría hacerlo así
data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[1:3]
Pero digamos que no quería las primeras tres filas sino tres filas aleatorias, entonces me gustaría hacer algo como esto ...
data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[sample(x= 1:number of rows of that previous data.table,size = 3 ]
Eso no funcionará. ¿Cómo calculo, sobre la marcha, cuál fue la longitud del data.frame inicial?
Acabo de hacer .N
trabajar en i
. Nuevo elemento README:
.N
ahora está disponible eni
, FR#724 . Gracias al novato here indirectamente y Farrel directamente aquí .
Esto ahora funciona:
DT[...][...][sample(.N,3)]
p.ej
> random.length <- sample(x = 15:30, size = 1)
> data.table(city = sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"),size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[sample(.N, 3)]
city score
1: New York 4
2: Pittsburgh 3
3: Cape Town 9
>
Hay un enfoque de dos pasos:
- Calcular el índice
i
usando.I
- Muestra en el índice
i
Código de ejemplo.
require(data.table)
random.length <- sample(x = 15:30, size = 1)
data.table(city = sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"),size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[,i := .I][sample(i, 3)]
Otra forma alternativa sería utilizar el enfoque de la aplicación.
Por ejemplo:
as.data.table(sapply(DT[], sample, 10))