在dplyr中,有没有一种方法可以对分组数据框的数据进行抽样?

3

假设我有一个按照两个因素分组的数据框。有没有一种方法可以使用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)

1
我猜 DF %>% filter(group_var %in% sample(unique(DF$group_var), 3, replace = F)) 不够 dplyr-oïd? - Vincent Bonhomme
恐怕不行 :-) 我仍需要手动创建分组变量并抽样。唯一的" dplyr "添加是使用" filter "替换" [ "。 - Latrunculia
3个回答

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

我相信管道本身已经很容易理解了。


这是一个非常优雅的解决方案!我接受它作为答案。 - Latrunculia

3
我在评论中发现了Vincent提供的解决方案,这正是我所需要的。我将其作为一种附加答案添加。
DF %>% filter(group_var %in% sample(unique(DF$group_var), 3, replace = F))

Vincent,我欠你一个+1。


2

可能不如您预期的那么漂亮,而且有点作弊,但这是我的解决方案:

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

我使用"indices"属性,它给出列表中各组的索引。我对此列表进行采样,取消列表嵌套,并添加1(似乎这些索引从0开始)。

然后我使用magrittr提取函数,它代表[]操作符。从这个意义上说,我有点作弊,因为实际上,我只是用管道重写了您的问题,并使用了来自分组dplyr的属性。


+1 是因为我不知道 magrittr:extract,而且它避免了创建分组变量,但它也不是我正在寻找的。考虑到该函数似乎不存在,那么它是否是一个有用的功能呢? - Latrunculia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接