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

时间:2016-03-17 22:30:26

标签: r dplyr plyr tidyr

给定数据集

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) 

有一些解决方案可以看起来那么简单吗?

2 个答案:

答案 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