【问题标题】:Summing the values of several R Lists based on a date key [duplicate]根据日期键对几个 R 列表的值求和 [重复]
【发布时间】:2019-07-06 14:20:04
【问题描述】:

我正在编写一个脚本,其中有两个列表,我正在尝试合并结果,以便获得一个新列表。每个列表都有一个日期,然后是两个数字。列表如下所示:

         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 个列表添加到此列表中,因此我想提取第一个列表,然后与第二个列表和第三个列表相结合,依此类推。我不知道我是否能够假设每个日期都在每个列表中。

【问题讨论】:

    标签: r list


    【解决方案1】:

    假设您的列表名为 list_df,您可以使用 bind_rowsgroup_by datesum 所有其他列将它们全部绑定在一起。

    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
    

    在基础 R 中可以使用Reduce 来实现

    aggregate(.~date, Reduce(rbind, list_df), sum)
    

    【讨论】:

    • 我喜欢这里的发展方向!感谢您加入。我的数据现在在两个列表中,所以我希望将它们合并。因此,我将有一个 list1 和 list2 并希望在此示例中合并到 list_df 中。我该怎么做?
    • @JAB 假设您拥有的是数据框而不是列表,您可以只为其中两个执行list_df &lt;- list(list1, list2)。更一般地说,您可以使用 list_df &lt;- mget(ls(pattern = "list\\d+")) 来处理多个数据帧。
    • 好的。凉爽的!棒极了。我也要试一试!
    【解决方案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))
    

    【讨论】:

      【解决方案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
      

      这假设数据集将始终具有相同的结构。

      【讨论】:

        猜你喜欢
        • 2018-08-01
        • 1970-01-01
        • 2019-05-05
        • 2023-01-26
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多