我正在处理一个有两个列表的脚本,并且试图合并结果以便获得一个新列表。每个列表都有一个日期,然后是两个数字。列表如下所示:
date clicks impressions
1 2019-06-01 1 2
2 2019-06-02 0 0
3 2019-06-03 100 120
和
date clicks impressions
1 2019-06-01 2 14
2 2019-06-02 3 14
3 2019-06-03 11 29
我想要一个列表
date clicks impressions
1 2019-06-01 3 16
2 2019-06-02 3 14
3 2019-06-03 111 149
完成此操作的最佳方法是什么。随着时间的推移,我将再添加20-30个列表,因此,我想拉第一个列表,然后与第二个列表结合,然后合并第三个列表,依此类推。我不知道是否可以假设每个日期都在每个列表中。
答案 0 :(得分:3)
假设您的列表名为list_df
,则可以使用bind_rows
,group_by
date
,然后使用sum
其他所有列将它们绑定在一起。 / p>
library(dplyr)
list_df %>%
bind_rows() %>%
group_by(date) %>%
summarise_all(sum)
# A tibble: 3 x 3
# date clicks impressions
# <fct> <int> <int>
#1 2019-06-01 3 16
#2 2019-06-02 3 14
#3 2019-06-03 111 149
可以使用Reduce
aggregate(.~date, Reduce(rbind, list_df), sum)
答案 1 :(得分:3)
我们可以做到:
cbind(date=df1[,1],do.call(`+`, list(df1[,-1],df2[,-1])),
row.names = NULL)
date clicks impressions
1 2019-06-01 3 16
2 2019-06-02 3 14
3 2019-06-03 111 149
如果您不确定日期是否存在(可以像上面那样cbind
):
do.call(`+`,lapply(list(df1,df2), function(x) x[,-1]))
clicks impressions
1 3 16
2 3 14
3 111 149
这假定数据集将始终具有相同的结构。
答案 2 :(得分:2)
我们可以使用data.table
library(data.table)
rbindlist(list_df)[, lapply(.SD, sum), date]
# date clicks impressions
#1: 2019-06-01 3 16
#2: 2019-06-02 3 14
#3: 2019-06-03 111 149
list_df <- mget(paste0("df", 1:2))