在 tidyverse 中递归或顺序输入变量

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

我有以下数据集

我想用这个公式计算第二行 n_j 列中的 NA n_j - (d_j+c_j).

创建数据

    df = structure(list(time_intervals = structure(1:8, levels = c("[0,12)", 
"[12,24)", "[24,36)", "[36,48)", "[48,60)", "[60,72)", "[72,84)", 
"[84,96]"), class = "factor"), d_j = c(16L, 10L, 1L, 3L, 2L, 
2L, 0L, 2L), c_j = c(4L, 4L, 0L, 1L, 2L, 0L, 1L, 0L), n_j = c(48L, 
NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))

我设法用 for 循环来做到这一点

for (i in 1:nrow(df)) {
  df <- df |> 
    mutate(
    n_j =
      ifelse(is.na(n_j), lag(n_j)- (lag(d_j)+lag(c_j)), n_j)
  )
}

有没有办法使用 purrr::map 或其他 tidyverse 函数来做到这一点?

r tidyverse
2个回答
0
投票

为什么不使用滞后函数? 变异(N_j = ifelse(is.na(n_j),lag(n_j,1)-(d_j+c_j),n_j))

如果我理解正确(因为使用我的手机,我不确定),这会给你你想要的,即前一行的 NJ(否则全部都是 na)减去特定行的 DJ 和 CJ 之和


0
投票
 transform(df, n_j = c(48, 48 - cumsum(d_j + c_j)[-nrow(df)]))
  time_intervals d_j c_j n_j
1         [0,12)  16   4  48
2        [12,24)  10   4  28
3        [24,36)   1   0  14
4        [36,48)   3   1  13
5        [48,60)   2   2   9
6        [60,72)   2   0   5
7        [72,84)   0   1   3
8        [84,96]   2   0   2
© www.soinside.com 2019 - 2024. All rights reserved.