R 将 NA 与上一个值相加 5 来填充 NA

R Fill NA With Adding 5 to Previous Value

提问人:bvowe 提问时间:11/3/2023 最后编辑:Maëlbvowe 更新时间:11/3/2023 访问量:33

问:

HAVE = data.frame(STUDENT = c(1,1,1,2,2,2,3,3),
                  TIME = c(1,2,3,1,2,3,1,2),
                  SCORE = c(7, NA, NA, 5, NA, 19, NA, 2))

WANT = data.frame(STUDENT = c(1,1,1,2,2,2,3,3),
                  TIME = c(1,2,3,1,2,3,1,2),
                  SCORE = c(7, 12, 17, 5, 10, 19, NA, 2))

我希望通过执行以下步骤来修改 SCORE: 如果 is.na(SCORE),则取 STUDENT 的前一个值并加 5。但只能向下做,而不是向上。

我尝试过这个没有成功,当学生连续有两个 NA 时它不起作用

HAVE %>% group_by(STUDENT) %>% mutate(WANT = ifelse(is.na(SCORE), lag(SCORE) + 5, SCORE))
r dplyr na

评论


答:

1赞 Maël 11/3/2023 #1

您可以使用:purrr::accumulate

library(dplyr)
library(purrr)
HAVE |> 
  mutate(SCORE = accumulate(SCORE, ~ if(is.na(.y)) .x + 5 else .y),
         .by = STUDENT)

#   STUDENT TIME SCORE
# 1       1    1     7
# 2       1    2    12
# 3       1    3    17
# 4       2    1     5
# 5       2    2    10
# 6       2    3    19
# 7       3    1    NA
# 8       3    2     2

或者,在基数 R 中,使用 和 :Reduceaccumulate = TRUE

na_add <- function(col, n = 5){
  Reduce(function(x, y) if(is.na(y)) x + n else y, col, accumulate = TRUE)
}
with(HAVE, ave(SCORE, STUDENT, FUN = na_add))
#[1]  7 12 17  5 10 19 NA  2