【问题标题】:Calculate cumulative sum (cumsum) by group按组计算累积和(cumsum)
【发布时间】:2013-05-26 20:34:24
【问题描述】:

有数据框:

df <- data.frame(id = rep(1:3, each = 5)
                 , hour = rep(1:5, 3)
                 , value = sample(1:15))

我想添加一个与id 匹配的累积总和列:

df
   id hour value csum
1   1    1     7    7
2   1    2     9   16
3   1    3    15   31
4   1    4    11   42
5   1    5    14   56
6   2    1    10   10
7   2    2     2   12
8   2    3     5   17
9   2    4     6   23
10  2    5     4   27
11  3    1     1    1
12  3    2    13   14
13  3    3     8   22
14  3    4     3   25
15  3    5    12   37

我怎样才能有效地做到这一点?谢谢!

【问题讨论】:

    标签: r cumsum


    【解决方案1】:
    df$csum <- ave(df$value, df$id, FUN=cumsum)
    

    ave 是“首选”函数,如果您想要一个与现有向量长度相等的按组向量,并且可以单独从这些子向量计算它。如果您需要基于多个“并行”值的按组处理,则基本策略是do.call(rbind, by(dfrm, grp, FUN))

    【讨论】:

    • unique.default(x, nmax = nmax) 中的错误:unique() 仅适用于向量
    • 我一直忘记...需要命名 FUN 参数。
    • 请注意,如果多列定义每个唯一行,您可以添加额外的id 变量。例如,df$csum &lt;- ave(df$value, df$id1, df$id2, FUN=cumsum).
    • @42- plyr 于 2013 年被封存(六年前)。你应该推荐dplyr/tidyverse/data.table
    • @smci:你看评论的日期了吗?你是在建议我回顾我所有的 cmets 并更新它们吗?更不用说我真的不喜欢plyrdplyr。 (我确实提到了data.table。)所以我决定删除评论并将有用的东西放在答案中。
    【解决方案2】:

    使用 dplyr::

    require(dplyr)
    df %>% group_by(id) %>% mutate(csum = cumsum(value))
    

    【讨论】:

    • 嘿,我试过你的方法。不知何故,分组无法正常工作。它对所有数据点进行 cumsum 而不分组。有什么建议吗?
    • 有时在这些情况下开始一个新的 r 会话会有所帮助。在示例数据上尝试我的代码。
    • 只是一个更新,你可能有一个包已经加载了plyr。显式引用dplyr 也会修复它:``` df %>% group_by(id) %>% dplyr::mutate(csum = cumsum(value)) ```
    【解决方案3】:

    要添加替代方案,data.table 的语法很好:

    library(data.table)
    DT <- data.table(df, key = "id")
    DT[, csum := cumsum(value), by = key(DT)]
    

    或者,更简洁:

    library(data.table)
    setDT(df)[, csum := cumsum(value), id][]
    

    以上将:

    • 通过引用将data.frame 转换为data.table
    • 计算按id分组的值的累积总和,并通过引用赋值
    • 打印(最后一个[]那里)整个操作的结果

    “df”现在将是一个带有“csum”列的data.table

    【讨论】:

      【解决方案4】:

      使用库plyr

      library(plyr)
      ddply(df,.(id),transform,csum=cumsum(value))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 2020-11-04
        • 2021-05-11
        相关资源
        最近更新 更多