给定数据集
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)
有一些解决方案可以看起来那么简单吗?
答案 0 :(得分:2)
您可以使用mapply
以及split(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
答案 1 :(得分:2)
您可以从我的“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