我想用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做这件事吗?
感谢您的帮助
答案 0 :(得分:3)
考虑将数据集的形状更改为更长的格式。例如,您可以在汇总之前使用 tidyr 包中的gather
到收集 A
和B
到一个列中。
以下是将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