2015-05-07 22 views
6

ho un set di dati di 1000 righe con la seguente struttura:campionamento sul fattore R

 device geslacht leeftijd type1 type2 
1  mob  0  53  C  3 
2  tab  1  64  G  7 
3  pc  1  50  G  7 
4  tab  0  75  C  3 
5  mob  1  54  G  7 
6  pc  1  58  H  8 
7  pc  1  57  A  1 
8  pc  0  68  E  5 
9  pc  0  66  G  7 
10  mob  0  45  C  3 
11  tab  1  77  E  5 
12  mob  1  16  A  1 

desidero fare un campione di 80 righe, composta da 10 righe con type1 = A, 10 righe con type1 = B, e così via. C'è qualcuno che può aiutarlo?

risposta

7

Soluzione base R:

do.call(rbind, 
     lapply(split(df, df$type1), function(i) 
      i[sample(1:nrow(i), size = 10, replace = TRUE),])) 

EDIT:

Altre soluzioni suggerite da @BrodieG

with(DF, DF[unlist(lapply(split(seq(type), type), sample, 10, TRUE)), ]) 

with(DF, DF[c(sapply(split(seq(type), type), sample, 10, TRUE)), ]) 
9

Ecco come mi avvicino a questo utilizzando data.table

library(data.table) 
indx <- setDT(df)[, .I[sample(.N, 10, replace = TRUE)], by = type1]$V1 
df[indx] 
#  device geslacht leeftijd type1 type2 
# 1: mob  0  45  C  3 
# 2: mob  0  53  C  3 
# 3: tab  0  75  C  3 
# 4: mob  0  53  C  3 
# 5: tab  0  75  C  3 
# 6: mob  0  45  C  3 
# 7: tab  0  75  C  3 
# 8: mob  0  53  C  3 
# 9: mob  0  53  C  3 
# 10: mob  0  53  C  3 
# 11: mob  1  54  G  7 
#... 

o una versione più semplice sarebbe

setDT(df)[, .SD[sample(.N, 10, replace = TRUE)], by = type1] 

Fondamentalmente stiamo campionando (con replacement- quando si dispone di meno di 10 righe all'interno di ogni gruppo) dagli indici di riga all'interno di ciascun gruppo di type1 e quindi sottoponendo i dati a questo indice


Allo stesso modo con dplyr si potrebbe fare

library(dplyr) 
df %>% 
    group_by(type1) %>% 
    sample_n(10, replace = TRUE) 
5

Un'altra opzione nella base R:

df[as.vector(sapply(unique(df$type1), 
        function(x){ 
         sample(which(df$type1==x), 10, replace=T) 
        })), ]