gpt4 book ai didi

R/dplyr : Using a loop to create lags and calculate cumulative sums based on column names

转载 作者:行者123 更新时间:2023-12-02 19:19:41 25 4
gpt4 key购买 nike

我想循环遍历大型数据框中的一长列列,并计算列滞后值的累积和。换句话说,我在计算每次观察之前“完成”了多少工作。

玩具数据框有助于使这一点更清晰。

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,所以我想我在这方面的做法有点奇怪。很高兴能完全修改它!)

最佳答案

如果我理解正确,以下内容应该有效:

可重现的样本数据(有 3 个变量用于求和):

set.seed(123)
df = data.frame(
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),
v3 = sample(seq(1, 20), 5)
)

> df
id date v1 v2 v3
1 a 2015-12-01 6 1 20
2 a 2015-12-02 15 11 9
3 a 2015-12-03 8 17 13
4 b 2015-12-04 16 10 10
5 b 2015-12-05 17 8 2

按 ID 分组,按日期排序(如果它们不按顺序排列),并对两个命名变量之间的所有命名变量进行变异(在本例中为 v1:v3):

df %>%
group_by(id) %>%
arrange(date) %>%
mutate_at(vars(v1:v3), funs(Cum = cumsum(lag(., default = 0)))) %>%
ungroup()


# A tibble: 5 x 8
# Groups: id [2]
id date v1 v2 v3 v1_Cum v2_Cum v3_Cum
<fctr> <date> <int> <int> <int> <int> <int> <int>
1 a 2015-12-01 6 1 20 0 0 0
2 a 2015-12-02 15 11 9 6 1 20
3 a 2015-12-03 8 17 13 21 12 29
4 b 2015-12-04 16 10 10 0 0 0
5 b 2015-12-05 17 8 2 16 10 10

关于R/dplyr : Using a loop to create lags and calculate cumulative sums based on column names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50595177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com