2016-07-07 74 views
2

假设我有一个数据框按2个因子分组。有没有办法用dplyr对数据组进行采样? (注:样品组)有没有办法在分组的数据帧中对数据组进行采样(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) 
+0

我推测'DF%>%过滤器(group_var%in%sample(unique(DF $ group_var),3,replace = F))'不够dplyr-oïd? –

+0

恐怕不行:-)我仍然需要创建分组变量并且手动采样。唯一的'dplyr'加法是'filter'来代替'[' – Latrunculia

回答

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 

管道本身是不言自明的,我相信。

+0

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

2

大概不会一样漂亮,你会希望它是种欺骗,但这里是我的解决方案:

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

我使用“indices”属性给出了列表中的组的索引。我对这个列表进行抽样,取消列表并加1(看起来这些索引从0开始)。

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

+0

+1',因为我不知道'magrittr:extract',因为它避免了创建一个分组变量,但它并不是我真正想要的无论是。鉴于该功能似乎不存在,它会是一个有用的功能? – Latrunculia

1

我在评论中发现文森特的解决方案是我需要的。我将其添加为一个额外的答案。

DF %>% filter(group_var %in% sample(unique(DF$group_var), 3, replace = F)) 

文森特,我欠你一个+1。