dplyr - summarise_each按因子相等对多列进行分组

时间:2014-10-06 14:06:14

标签: r group-by dplyr

我想用A或B总结每列的总和 of gg

> 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做这件事吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

考虑将数据集的形状更改为更长的格式。例如,您可以在汇总之前使用 tidyr 包中的gather收集 AB到一个列中。

以下是将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

答案 1 :(得分: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