tablas - tabla de numeros aleatorios para muestreo pdf
Muestra filas aleatorias dentro de cada grupo en una tabla de datos. (4)
Creo que la respuesta de joran puede ser más generalizada. Los detalles están aquí ( cómo muestrea grupos en una tabla de datos con una advertencia ) pero creo que esta solución explica los casos en los que no hay "3" filas para muestrear.
La solución actual producirá un error cuando intente muestrear "x" veces de las filas que tienen menos de "x" valores comunes. En el caso siguiente, x = 3. Y tiene en cuenta esta advertencia. (Solución hecha por nrussell)
set.seed(123)
##
DT <- data.table(
a=c(1,1,1,1:15,1,1),
b=sample(1:1000,20))
##
R> DT[,.SD[sample(.N,min(.N,3))],by = a]
a b
1: 1 288
2: 1 881
3: 1 409
4: 2 937
5: 3 46
6: 4 525
7: 5 887
8: 6 548
9: 7 453
10: 8 948
11: 9 449
12: 10 670
13: 11 566
14: 12 102
15: 13 993
16: 14 243
17: 15 42
¿Cómo usaría data.table para tomar de manera eficiente una muestra de filas dentro de cada grupo en un marco de datos?
DT = data.table(a = sample(1:2), b = sample(1:1000,20))
DT
a b
1: 2 562
2: 1 183
3: 2 180
4: 1 874
5: 2 533
6: 1 21
7: 2 57
8: 1 20
9: 2 39
10: 1 948
11: 2 799
12: 1 893
13: 2 993
14: 1 69
15: 2 906
16: 1 347
17: 2 969
18: 1 130
19: 2 118
20: 1 732
Estaba pensando en algo como: DT[ , sample(??, 3), by = a]
que devolvería una muestra de tres filas por cada "a" (el orden de las filas devueltas no es significativo):
a b
1: 2 180
2: 2 57
3: 2 799
4: 1 69
5: 1 347
6: 1 732
Inspirado por esta respuesta de David Arenburg , otro método para evitar la asignación de .SD
sería muestrear los grupos y luego unirse a los datos originales utilizando .EACHI
DT[ DT[, sample(.N, 3), by=a], b[i.V1], on="a", by=.EACHI]
# a V1
# 1: 2 42
# 2: 2 498
# 3: 2 179
# 4: 1 469
# 5: 1 93
# 6: 1 898
donde la línea DT[, sample(.N, 3), by=a]
nos da una muestra para cada grupo
# a V1
# 1: 1 9
# 2: 1 3
# 3: 1 2
# 4: 2 4
# 5: 2 9
# ---
entonces podemos usar V1
para darnos la b
que corresponde.
Tal vez algo como esto?
> DT[,.SD[sample(.N, min(3,.N))],by = a]
a b
1: 1 744
2: 1 497
3: 1 167
4: 2 888
5: 2 950
6: 2 343
(Gracias a Josh por la corrección, abajo.)
Muestreo estratificado > sobremuestreo
size=don[y==1,.(strata=length(iden)),by=.(y,x)] # count of iden by strata
table(don$x,don$y)
don<-merge(don,size[,.(y,strata)],by="x") #merge strata values
don_strata=don[,.SD[sample(.N,strata)],by=.(y,x)]