与数据框架。
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
如何才能高效地完成这个任务?谢谢!有了数据框架:df
df$csum <- ave(df$value, df$id, FUN=cumsum)
ave
是 "去 "的函数,如果你想要一个与现有向量等长的按组向量,并且它可以单独从这些子向量中计算出来。如果你需要基于多个 "并行 "值的按组处理,基本策略是 do.call(rbind, by(dfrm, grp, FUN))
.
除备选方案外,还有: 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
参照[]
那里"df "现在将是一个 data.table
与 "csum "列。
使用dplyr::
require(dplyr)
df %>% group_by(id) %>% mutate(csum = cumsum(value))
使用库 plyr
.
library(plyr)
ddply(df,.(id),transform,csum=cumsum(value))