2014-10-06 8 views
1

Я хочу суммировать каждую сумму столбца, группы А или В ГГdplyr - summarise_each группировка по фактору равенства в отношении нескольких столбцов

> 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

Рассмотрите возможность изменения формы вашего набора данных в более длинном формате. Например, вы можете использовать gather из пакета tidyr до собирать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 
+0

спасибо !! Я не знал, что собираюсь из пакета тидыр – Felipe

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

Смежные вопросы