如何从R中的每个组中随机选择两组行

时间:2016-07-18 04:24:57

标签: r subset

我有一个名为test.data的数据框,其中有一个名为Ethnicity的列。有三组种族(实际数据更多),Adygei,Balochi和Biaka_pygmies。我希望将此数据框子集,以便从每个种族群体中随机包含两个样本(行)并获得result。我怎么能在R?中做到这一点?

test.data <-  structure(list(Sample = c("1793102418_A", "1793102460_A", "1793102500_A", 
"1793102576_A", "1749751113_A", "1749751187_A", "1749751189_A", 
"1749751285_A", "1749751356_A", "1749751195_A", "1749751218_A", 
"1775705355_A"), Ethnicity = c("Adygei", "Adygei", "Adygei", 
"Adygei", "Balochi", "Balochi", "Balochi", "Balochi", "Balochi", 
"Biaka_Pygmies", "Biaka_Pygmies", "Biaka_Pygmies"), Height = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Sample", "Ethnicity", 
"Height"), row.names = c("1793102418_A", "1793102460_A", "1793102500_A", 
"1793102576_A", "1749751113_A", "1749751187_A", "1749751189_A", 
"1749751285_A", "1749751356_A", "1749751195_A", "1749751218_A", 
"1775705355_A"), class = "data.frame")

结果

                        Sample     Ethnicity Height
    1793102418_A 1793102418_A        Adygei      0
    1793102460_A 1793102460_A        Adygei      0
    1749751189_A 1749751189_A       Balochi      0
    1749751285_A 1749751285_A       Balochi      0
    1749751195_A 1749751195_A Biaka_Pygmies      0
    1775705355_A 1775705355_A Biaka_Pygmies      0

1 个答案:

答案 0 :(得分:2)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(test.data)),按'种族'分组,我们sample行序列,并根据该行对其进行子集化。

setDT(test.data)[, .SD[sample(1:.N,2)], Ethnicity]

或使用tapply

中的base R
test.data[ with(test.data, unlist(tapply(seq_len(nrow(test.data)),
                     Ethnicity, FUN = sample, 2))), ]