使用数据框:
df <- data.frame(id = rep(1:3, each = 5)
, hour = rep(1:5, 3)
, value = sample(1:15))
Run Code Online (Sandbox Code Playgroud)
我想添加一个匹配的累积和列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
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地做到这一点?谢谢!
42-*_*42- 35
df$csum <- ave(df$value, df$id, FUN=cumsum)
Run Code Online (Sandbox Code Playgroud)
A5C*_*2T1 19
要添加替代方案,data.table语法很好:
library(data.table)
DT <- data.table(df, key = "id")
DT[, csum := cumsum(value), by = key(DT)]
Run Code Online (Sandbox Code Playgroud)
或者,更紧凑:
library(data.table)
setDT(df)[, csum := cumsum(value), id][]
Run Code Online (Sandbox Code Playgroud)
以上将:
data.frame为adata.table[]那里)整个操作的结果"df"现在将data.table成为"csum"列.
Tje*_*ebo 10
使用dplyr ::
require(dplyr)
df %>% group_by(id) %>% mutate(csum = cumsum(value))
Run Code Online (Sandbox Code Playgroud)
使用库plyr.
library(plyr)
ddply(df,.(id),transform,csum=cumsum(value))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23651 次 |
| 最近记录: |