Суммируйте столбцы между фреймами данных в списке в соответствии с соответствующими строками

У меня получился следующий список:

df = read.table(text = 'Var1 Freq
1 12
2 19
3 3
5 7
6 55
9 17', header = TRUE)

df1 = read.table(text = 'Var1 Freq
1 16
2 1
3 22
5 87
6 5
7 9
11 76', header = TRUE)

df2 = read.table(text = 'Var1 Freq
1 17
2 11
5 7
6 32
7 10
15 6
20 54', header = TRUE)

lst = list(df, df1, df2)

Мне нужно суммировать каждый столбец Freq с относительной строкой Var1 для каждого data.frame.

Вот мой желаемый результат:

Var1 Freq
1 45
2 31
3 25
5 101
6 92
7 19
9 17
11 76
15 6
20 54

Как я могу это сделать? Помогает ли Map в этом случае?

Спасибо


person aaaaa    schedule 05.05.2017    source источник
comment
Я провел микробенчмарк по трем ответам ниже: do.call, dplyr и data.table. DT был самым быстрым, dplyr занял в 1,6 раза больше времени, а do.call занял в 6,3 раза больше времени, для тех, кому интересно. Я использовал ответ dplyr, потому что его проще применить к нескольким столбцам. По крайней мере, это было для меня.   -  person hmhensen    schedule 15.12.2018


Ответы (3)


Используйте do.call для rbind отдельных кадров данных списка в один data.frame, а затем используйте aggregate для sum

with(do.call(rbind, lst), aggregate(Freq, by = list(Var1), sum))
#   Group.1   x
#1        1  45
#2        2  31
#3        3  25
#4        5 101
#5        6  92
#6        7  19
#7        9  17
#8       11  76
#9       15   6
#10      20  54
person d.b    schedule 05.05.2017
comment
Вы можете добавить имена столбцов с помощью aggregate(cbind(Freq=Freq), by = list(Var1=Var1), sum)). - person lmo; 05.05.2017

Другая идея:

library(dplyr) 
bind_rows(lst) %>% group_by(Var1) %>% summarise(Freq = sum(Freq))

Который дает:

## A tibble: 10 × 2
#    Var1  Freq
#   <int> <int>
#1      1    45
#2      2    31
#3      3    25
#4      5   101
#5      6    92
#6      7    19
#7      9    17
#8     11    76
#9     15     6
#10    20    54
person Steven Beaupré    schedule 05.05.2017

Еще идея rbindlist от data.table

library(data.table)
rbindlist(lst)[, .(Freq = sum(Freq)), Var1]
#    Var1 Freq
# 1:    1   45
# 2:    2   31
# 3:    3   25
# 4:    5  101
# 5:    6   92
# 6:    9   17
# 7:    7   19
# 8:   11   76
# 9:   15    6
#10:   20   54
person akrun    schedule 06.05.2017