R- data.table中的组的随机样本

0 r data.table

如何在data.table中随机采样例如三组,以使结果包含三组,其中原始data.table中的所有行均如此?

library(data.table)
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C", "D", "E", "F"), 20, 
replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

我知道如何从data.table中随机选择10行:

dat.sampl1 <- as.data.table(sapply(dat[], sample, 10))
Run Code Online (Sandbox Code Playgroud)

还有如何按组抽样

dat[,.SD[sample(.N, min(.N,3))], by = groups]
Run Code Online (Sandbox Code Playgroud)

但是如何随机分组?因此结果应如下所示:

    ids groups
     1      F
    11      F
     3      F
    18      F
     8      A
     9      A
    10      A
    17      A
    19      A
    12      E
    14      E
    16      E
Run Code Online (Sandbox Code Playgroud)

Wei*_*ong 5

您的意思是:

set.seed(123)
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C", "D", "E", "F"), 20, 
replace=TRUE))
dat[groups %in% sample(unique(dat[, groups]), size = 3)][order(groups)]
#     ids groups
#  1:   3      C
#  2:  10      C
#  3:  12      C
#  4:   7      D
#  5:   9      D
#  6:  14      D
#  7:   4      F
#  8:   5      F
#  9:   8      F
# 10:  11      F
# 11:  16      F
# 12:  20      F
Run Code Online (Sandbox Code Playgroud)

如果要对具有replacement的组进行抽样,则可以执行以下操作,其中A两次已被抽样:

dat[unique(dat[, list(groups)])[sample(.N, 3, replace = TRUE)], on = "groups"]
#    ids groups
# 1:   3      C
# 2:  10      C
# 3:  12      C
# 4:   6      A
# 5:  15      A
# 6:  18      A
# 7:   6      A
# 8:  15      A
# 9:  18      A
Run Code Online (Sandbox Code Playgroud)