使用下面的数据框作为我想要做的粗略示例,在 b 列中,当 times = 0 时,我有正确的值,但我想对其进行编码,以便当前空白的值将使用该列中的值上面减去该行中的 a 值。
df <- data.frame(ages = c(20,20,20,20,
21,21,21,21,
22,22,22,22,
23,23,23,23),
year = c(2023,2024,2025,2026,
2023,2024,2025,2026,
2023,2024,2025,2026,
2023,2024,2025,2026),
times = c(0,1,2,3,
0,1,2,3,
0,1,2,3,
0,1,2,3),
a = c(-0.1,-0.26,-0.39,-0.48,
-0.05,-0.11,-0.23,-0.68,
-0.02,-0.13,-0.28,-0.33,
-0.01,-0.44,-0.5,-0.52),
b = c(1,"","","",
2,"","","",
3,"","","",
4,"","",""))
作为参考,我最近才开始使用 R,因此为什么我可能会遗漏一些明显的东西?
我尝试了一些 mutate 和 lag 函数,但不断收到错误,因为我认为我还没有完全掌握他们在做什么
将
df$b
更改为数字,获取 df$b
为 NA
的索引,然后循环这些索引,每次更新 df$b
中的值:
df$b <- as.numeric(df$b)
indx = which(is.na(df$b))
for(i in indx) df[i, "b"] <- df[i-1, "b"] - df[i, "a"]
输出:
ages year times a b
1 20 2023 0 -0.10 1.00
2 20 2024 1 -0.26 1.26
3 20 2025 2 -0.39 1.65
4 20 2026 3 -0.48 2.13
5 21 2023 0 -0.05 2.00
6 21 2024 1 -0.11 2.11
7 21 2025 2 -0.23 2.34
8 21 2026 3 -0.68 3.02
9 22 2023 0 -0.02 3.00
10 22 2024 1 -0.13 3.13
11 22 2025 2 -0.28 3.41
12 22 2026 3 -0.33 3.74
13 23 2023 0 -0.01 4.00
14 23 2024 1 -0.44 4.44
15 23 2025 2 -0.50 4.94
16 23 2026 3 -0.52 5.46
还可以使用
dplyr
和 Reduce
,如下所示:
library(dplyr)
df$b <- as.numeric(df$b)
mutate(
df,
b = Reduce(\(z,i) z-a[i],x=2:n(),init=b[1], accumulate = T),
.by = ages
)
输出:
ages year times a b
1 20 2023 0 -0.10 1.00
2 20 2024 1 -0.26 1.26
3 20 2025 2 -0.39 1.65
4 20 2026 3 -0.48 2.13
5 21 2023 0 -0.05 2.00
6 21 2024 1 -0.11 2.11
7 21 2025 2 -0.23 2.34
8 21 2026 3 -0.68 3.02
9 22 2023 0 -0.02 3.00
10 22 2024 1 -0.13 3.13
11 22 2025 2 -0.28 3.41
12 22 2026 3 -0.33 3.74
13 23 2023 0 -0.01 4.00
14 23 2024 1 -0.44 4.44
15 23 2025 2 -0.50 4.94
16 23 2026 3 -0.52 5.46