2015-04-20 11 views
5

Mam ramki danych jako takie:Dplyr summarise_each do zagregowanych wyników

metric1 metric2 metric3 field1 field2 
1 1.07809668 4.2569882 7.1710095  L  S1 
2 0.56174763 1.2660273 -0.3751915  L  S2 
3 1.17447327 5.5186679 11.6868322  L  S2 
4 0.32830724 -0.8374830 1.8973718  S  S2 
5 -0.51213503 -0.3076640 10.0730274  S  S1 
6 0.24133119 2.7984703 15.9622215  S  S1 
7 1.96664414 0.1818531 2.7416768  S  S3 
8 0.06669409 3.8652075 10.5066330  S  S3 
9 1.14660437 8.5703119 3.4294062  L  S4 
10 -0.72785683 9.3320762 1.3827989  L  S4 

ja Pokazuje 2 pól, ale mają kilka innych. Muszę podsumować dane pogrupowane według każdego pola, np. dla pole1:

DF %>% group_by(field1) %>% summarise_each(funs(sum),metric1,metric2,metric3) 

mogę zrobić to dla każdej dziedzinie, w której kolumny byłaby suma (metric1), suma (metric2), suma (metric3), ale wyjście stół potrzebne jest coś takiego:

L(field1) S(field1) S1(field2) S2(field2) S3(field2) S4(field2) 
sum(metric1) 

sum(metric2) 

sum(metric3) 

wierzę, że musi być jakiś sposób, aby to zrobić za pomocą tidyr wraz z dplyr ale nie może zrozumieć to

Odpowiedz

6

Spróbuj recast z reshape2 pakietu

library(reshape2) 
recast(DF, variable ~ field1 + field2, sum) 
# variable  L_S1  L_S2  L_S4  S_S1  S_S2  S_S3 
# 1 metric1 1.078097 1.736221 0.4187475 -0.2708038 0.3283072 2.033338 
# 2 metric2 4.256988 6.784695 17.9023881 2.4908063 -0.8374830 4.047061 
# 3 metric3 7.171010 11.311641 4.8122051 26.0352489 1.8973718 13.248310 

która jest taka sama jak

dcast(melt(DF, c("field1", "field2")), variable ~ field1 + field2, sum) 

Można również połączyć go z tidyr::gather jeśli chcesz, ale nie można wykorzystać tidyr::spread ponieważ nie mają fun.aggregate argumentów

DF %>% 
    gather(variable, value, -(field1:field2)) %>% 
    dcast(variable ~ field1 + field2, sum) 
# variable  L_S1  L_S2  L_S4  S_S1  S_S2  S_S3 
# 1 metric1 1.078097 1.736221 0.4187475 -0.2708038 0.3283072 2.033338 
# 2 metric2 4.256988 6.784695 17.9023881 2.4908063 -0.8374830 4.047061 
# 3 metric3 7.171010 11.311641 4.8122051 26.0352489 1.8973718 13.248310 
+1

dziękuję za odpowiedź, która jednak nie daj mi dokładnie to, czego chcę. Kolumny są interesekcji pól1 i pola2. Chcę tabeli, która umieszcza elementy pola 1 jako kolumny, a następnie elementy pola 2 jako kolumny ... itd. – macrotourist

2

dla wszystkie rozwiązania dplyr i tidyr, można wykonać:

library(dplyr) 
library(tidyr) 

df %>% 
    unite(variable, field1, field2) %>% 
    group_by(variable) %>% 
    summarise_each(funs(sum)) %>% 
    gather(metrics, value, -variable) %>% 
    spread(variable, value) 

Co daje:

#Source: local data frame [3 x 7] 
# 
# metrics  L_S1  L_S2  L_S4  S_S1  S_S2  S_S3 
#1 metric1 1.078097 1.736221 0.4187475 -0.2708038 0.3283072 2.033338 
#2 metric2 4.256988 6.784695 17.9023881 2.4908063 -0.8374830 4.047061 
#3 metric3 7.171010 11.311641 4.8122051 26.0352489 1.8973718 13.248310 

Edycja

Po przeczytaniu komentarz na odpowiedź Dawida, myślę, że to jest bliżej do oczekiwanego wyjścia:

field1 <- group_by(df, field = field1) %>% summarise_each(funs(sum), -(field1:field2)) 
field2 <- group_by(df, field = field2) %>% summarise_each(funs(sum), -(field1:field2)) 

bind_rows(field1, field2) %>% 
    gather(metrics, value, -field) %>% 
    spread(field, value) 

co daje:

#Source: local data frame [3 x 7] 
# 
# metrics   L   S   S1  S2  S3   S4 
#1 metric1 3.233065 2.090842 0.8072928 2.064528 2.033338 0.4187475 
#2 metric2 28.944071 5.700384 6.7477945 5.947212 4.047061 17.9023881 
#3 metric3 23.294855 41.180931 33.2062584 13.209013 13.248310 4.8122051 
+1

Dziękuję bardzo Steven! Potrzebuję więcej praktyki z użyciem tidyr. – macrotourist