假设我有以下简单的data.frame
:
ID value
1 1 3
2 2 4
3 1 5
4 3 3
我想要的输出位于下方,我们将value
添加到cumsum
,或者根据已使用的value
的最新ID
进行更新。
ID value cumsum
1 1 3 3
2 2 4 7
3 1 5 9
4 3 3 12
在第3行中,新的value
形成了更新的cumsum
(7-3+5=9)
。第4行向value
添加了新的cumsum
,因为在ID
之前未使用(4+5+3=12)
。
答案 0 :(得分:1)
这会为您的示例生成所需的结果:
df<-read.table(header=T, text="ID value
1 1 3
2 2 4
3 1 5
4 3 3")
library(tidyverse)
df %>%
group_by(ID) %>%
mutate(value = value-lag(value, def = 0L)) %>%
ungroup %>% mutate(cumsum = cumsum(value))
# # A tibble: 4 x 3
# ID value cumsum
# <int> <int> <int>
# 1 1 3 3
# 2 2 4 7
# 3 1 2 9
# 4 3 3 12
答案 1 :(得分:1)
我将data.table
用于cumsum
。计算累积均值有点棘手,因为仅使用cummean
不能调整oberservations的数量。
library(data.table)
dt = data.table(id = c(1, 2, 1, 3), value = c(3, 4, 5, 3))
dt[, tmp := value-shift(value, n = 1L, type = "lag", fill = 0), by = c("id")]
#CUMSUM
dt[, cumsum := cumsum(tmp)]
#CUMMEAN WITH UPDATED N
dt[value != tmp, skip := 1:.N]
dt[, skip := na.locf(skip, na.rm = FALSE)]
dt[is.na(skip), skip := 0]
dt[, cummean := cumsum(tmp)/(seq_along(tmp)-skip)]
输出是:
id value tmp cumsum skip cummean
1: 1 3 3 3 0 3.0
2: 2 4 4 7 0 3.5
3: 1 5 2 9 1 4.5
4: 3 3 3 12 1 4.0
修改:将lag
功能更改为data.table
shift
功能。