For the whole dplyr and tidyr you can do:
library(dplyr) library(tidyr) df %>% unite(variable, field1, field2) %>% group_by(variable) %>% summarise_each(funs(sum)) %>% gather(metrics, value, -variable) %>% spread(variable, value)
What gives:
#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
Edit
After reading my comment on David, I think this is closer to the expected result:
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)
What gives:
#Source: local data frame [3 x 7] # # metrics LS 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
source share