2014-10-06 78 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