数据集中每个组的不同样本数

Different sample number for each group in a data set

给定一个数据集

key <- rep(c('a', 'b', 'c'), 10)
value <- sample(30)
df <- data.frame(key, value)

我想在键中为每个组使用不同数量的样本,使用 dplyr 的简单代码显然不适用于此任务是

ns <- c('a'= 1, 'b'= 2, 'c' = 3)
df %>%
mutate(n_s = ns[key]) %>%
group_by(key) %>%
sample_n(n_s) 

有一些看起来这么简单的解决方案吗?

您可以使用 mapplysplit(df, df$key)ns 作为参数,但请注意 ns 的名称未被使用。重要的是组的顺序,如果组的数量与ns的长度不匹配,ns将被回收。

set.seed(129)
mapply(sample_n, split(df, df$key), ns, SIMPLIFY = FALSE) %>%
  rbind_all
#     key value
#  (fctr) (int)
#1      a    29
#2      b    14
#3      b    22
#4      c    10
#5      c    24
#6      c     3

您可以查看我的 "splitstackshape" 包中的 stratified 函数:

library(splitstackshape)
ns <- c('a'= 1, 'b'= 2, 'c' = 3)
stratified(df, "key", size = ns)
#    key value
# 1:   a     7
# 2:   b    10
# 3:   b    13
# 4:   c     4
# 5:   c    20
# 6:   c     9