如何使用 dplyr 将累积列添加到 R 数据框?

Posted

技术标签:

【中文标题】如何使用 dplyr 将累积列添加到 R 数据框?【英文标题】:How to add a cumulative column to an R dataframe using dplyr? 【发布时间】:2014-03-16 02:53:06 【问题描述】:

我和this post有同样的问题,但我想用dplyr

使用 R 数据框,例如:

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

如何添加与 id 匹配的累积总和列?

没有dplyr 上一篇文章接受的解决方案是:

df$csum <- ave(df$value, df$id, FUN=cumsum)

【问题讨论】:

【参考方案1】:

像这样?

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

mutate(group_by(df,id), csum=cumsum(value))

或者如果你使用dplyr的管道操作符:

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

两种情况的结果:

Source: local data frame [15 x 4]
Groups: id

   id hour value csum
1   1    1     4      4
2   1    2    14     18
3   1    3     8     26
4   1    4     2     28
5   1    5     3     31
6   2    1    10     10
7   2    2     7     17
8   2    3     5     22
9   2    4    12     34
10  2    5     9     43
11  3    1     6      6
12  3    2    15     21
13  3    3     1     22
14  3    4    13     35
15  3    5    11     46

【讨论】:

谢谢。我想要获得与其他方法相同的输出,我需要使用 ungroup? 我认为 OP 的问题是,如果您分配结果 (df &lt;- df %&gt;% group_by ...),group_by 属性是否会保持不变,答案是确实如此。如果您不使用ungroup,则未来对重新分配的df 的操作将作用于id 列,这可能不是您想要的。 只需确保plyr 在您的会话中未处于活动状态。我花了一些时间弄清楚:dplyr::mutate(cumsum=cumsum(value))

以上是关于如何使用 dplyr 将累积列添加到 R 数据框?的主要内容,如果未能解决你的问题,请参考以下文章

R中的dplyr mutate - 添加列作为列的连接

R中的条件数据框突变与magrittr和dplyr

R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量将异常离散编码转化为NA值

R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面

R:如何只选择连续的数字列

在 R dplyr 中过滤具有多个条件名称匹配的数据框