2014-10-06 73 views
1

我想总结列的每个总和,按A或B GG的因素平等summarise_each分组dplyr - 通过对多个列

> gg 
    A B a1 a2 a3 
1 c2 c1 1 5 9 
2 c1 c3 2 6 10 
3 c4 c2 3 7 11 
4 c3 c2 4 8 12 

得到

> test 
    AB a1 a2 a3 
1 c1 3 11 19 
2 c2 8 20 32 
3 c3 6 14 22 
4 c4 3 7 11 

我知道如何为列A做:

test<-gg %>% 
    group_by(A) %>% 
    summarise_each(funs(sum(., na.rm=TRUE)),a1:a3) 

你能帮我做这两个A和B?

感谢您的帮助

回答

3

考虑将数据集的形状更改为更长的格式。例如,可以使用来自包tidyrgatherAB合并成单个列,然后进行求和。

以下是您可以如何使用gather和您的数据集,显示较长的输出数据集和新的AB列。

library(tidyr) 
gather(gg, group, AB, A:B) 

    a1 a2 a3 group AB 
1 1 5 9  A c2 
2 2 6 10  A c1 
3 3 7 11  A c4 
4 4 8 12  A c3 
5 1 5 9  B c1 
6 2 6 10  B c3 
7 3 7 11  B c2 
8 4 8 12  B c2 

您可以在分组之前将gather步骤添加到代码链中。然后group_by你的新的AB变量,并使用你的代码的其余部分,因为你有它。

library(dplyr) 
gg %>% 
    gather(group, AB, A:B) %>% 
    group_by(AB) %>% 
    summarise_each(funs(sum(., na.rm = TRUE)), a1:a3) 

Source: local data frame [4 x 4] 

    AB a1 a2 a3 
1 c1 3 11 19 
2 c2 8 20 32 
3 c3 6 14 22 
4 c4 3 7 11 
+0

谢谢!我不知道从包裹tidyr收集 – Felipe 2014-10-06 15:58:12

0

是否有你需要使用dplyr理由吗?

AB <- unique(dat$A, dat$B) 
data.frame(AB, do.call("rbind", lapply(AB, function(x) { 
    colSums(dat[dat$A==x | dat$B==x, c("a1", "a2", "a3")]) 
}))) 

## AB a1 a2 a3 
## 1 c2 8 20 32 
## 2 c1 3 11 19 
## 3 c4 3 7 11 
## 4 c3 6 14 22 
+0

谢谢,我试着用dplyr学习一些函数。 – Felipe 2014-10-06 15:56:10