尝试使用列中先前的值在 R 中执行计算

问题描述 投票:0回答:1

使用下面的数据框作为我想要做的粗略示例,在 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 函数,但不断收到错误,因为我认为我还没有完全掌握他们在做什么

r lag
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.