有没有办法对分组数据框中的数据组进行采样(dplyr)

时间:2016-07-07 13:22:10

标签: r dplyr

假设我有一个按2个因子分组的数据框。有没有办法用dplyr对数据组进行抽样? (注意:示例 组内的

示例:

DF <- data.frame(A = rep(LETTERS[1:4], each = 6),
                 B = rep(c(1:2), 12),
                 C = rnorm(24))

# base r solution

DF$group_var <- paste(DF$A, DF$B, sep = "_")
DF_sample <- DF[DF$group_var %in% sample(unique(DF$group_var), 3), ]

#possible dplyr solution?

DF_sample <- DF %>% group_by(A,B) %>% sample_group_of_data(3)

3 个答案:

答案 0 :(得分:4)

这是另一个管道解决方案,无论数据是否分组,它都可以工作:

DF %>% split(interaction(.$A, .$B)) %>% sample(3) %>% bind_rows()
# Source: local data frame [9 x 3]
# 
#       A     B          C
#   (fctr) (int)      (dbl)
# 1      B     1  0.2623781
# 2      B     1 -0.8193225
# 3      B     1  0.3348400
# 4      D     1  1.0744650
# 5      D     1  1.3528529
# 6      D     1  0.3016770
# 7      A     2 -0.1920754
# 8      A     2  0.6917583
# 9      A     2  0.1985326

管道本身非常明显,我相信。

答案 1 :(得分:2)

可能不像你想要的那么漂亮而且有点作弊但是,这是我的解决方案:

DF %>% group_by(A, B) %>%
  magrittr::extract(unlist(sample(attr(., "indices"), 5))+1, )

我使用“indices”属性,该属性给出列表中组的索引。我对此列表进行了示例,取消列表并添加1(似乎那些索引从0开始)。

然后我使用代表magrittr运算符的[]提取函数。从某种意义上说,我有点作弊,我刚刚用管道重写了你的问题并使用了分组dplyr中的属性。

答案 2 :(得分:2)

我发现文森特在评论中的解决方案是我需要的。我将其作为补充答案添加。

DF %>% filter(group_var %in% sample(unique(DF$group_var), 3, replace = F))
文森特,我欠你一个+1。