【发布时间】:2018-11-08 17:56:51
【问题描述】:
我想遍历大型数据框中的一长列列,并计算列滞后值的累积总和。换句话说,我在计算每次观察之前“完成”了多少。
Toy 数据框有助于使这一点更清晰。
id = c("a", "a", "a", "b", "b")
date = seq(as.Date("2015-12-01"), as.Date("2015-12-05"), by="days")
v1 = sample(seq(1, 20), 5)
v2 = sample(seq(1, 20), 5)
df = data.frame(id, date, v1, v2)
我希望它看起来像
id date v1 v2 v1Cum v2Cum
a 2015-12-01 1 13 0 0
a 2015-12-02 7 11 1 13
a 2015-12-03 12 2 8 24
b 2015-12-04 18 6 0 0
b 2015-12-05 4 9 18 6
所以它不是 id 组内 v1 或 v2 的累积和,而是每个 id 的滞后值的累积和。
我可以在单个列上执行此操作没问题,但我似乎无法通过循环对其进行概括:
vars = c("v1", "v2")
for (var in vars) {
lagname = paste(var, "Lag", sep="")
cumname = paste(var, "Cum", sep="")
df = arrange(df, id, date)
df = df %>%
group_by(id) %>%
mutate(!!lagname := dplyr::lag(var, n = 1, default = NA))
df[[lagname]] = ifelse(is.na(df[[lagname]]), 0, df[[lagname]])
df = df %>% group_by(id) %>% arrange(date) %>% mutate(!!cumname := cumsum(!!lagname))
}
在我看来,问题是
- 滞后变量仅计算为 NA(或 ifelse() 后为 0)。我知道我还没有完全掌握 mutate()。
- 累计求和结果为 NA
有什么想法吗?谢谢您的帮助! (我想在休息几年后重新开始编码。然而,我的主要“语言”是 Stata,所以我想我正在接近这个有点不稳定。很高兴完全修改这个!)
【问题讨论】: