基于日期键汇总多个R列表的值

时间:2019-07-06 14:20:04

标签: r list

我正在处理一个有两个列表的脚本,并且试图合并结果以便获得一个新列表。每个列表都有一个日期,然后是两个数字。列表如下所示:

         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个列表,因此,我想拉第一个列表,然后与第二个列表结合,然后合并第三个列表,依此类推。我不知道是否可以假设每个日期都在每个列表中。

3 个答案:

答案 0 :(得分:3)

假设您的列表名为list_df,则可以使用bind_rowsgroup_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

在基数R中实现
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))