如何使用 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 <- df %>% group_by ...
),group_by
属性是否会保持不变,答案是确实如此。如果您不使用ungroup
,则未来对重新分配的df
的操作将作用于id
列,这可能不是您想要的。
只需确保plyr
在您的会话中未处于活动状态。我花了一些时间弄清楚:dplyr::mutate(cumsum=cumsum(value))
以上是关于如何使用 dplyr 将累积列添加到 R 数据框?的主要内容,如果未能解决你的问题,请参考以下文章
R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量将异常离散编码转化为NA值
R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面