无法使用 dplyr 滞后函数填充 2 个连续行

Can not fill 2 concecutive rows using dplyr lag function

我使用 R 和 R 包 dplyr。 我想在数据框中填充前一行值中的缺失值(将其增加 1)。如果我有一个差距,它会很好地工作,但如果有 2 个或更多连续的缺失值,那么我就有问题了。 在这里假设我有一个数据框,并且对于某些行,它的值丢失了。

  id val1 val2
1  0    0    0
2  1    1    1
3  2   NA    NA
4  3    3    3
5  4   NA   NA
6  5   NA   NA
7  6    6    6

这里 val2 是我执行增加的值,而 val1 只是原始值。 对于 NA 值,我想采用前一行值并将其增加 1。 我使用 dplyr 包和滞后函数。
这是代码:

library(dplyr)
tmp.data <- data.frame(id = c(0:6),val1 = c(0:6)) %>%
  mutate(
    val1 = ifelse( val1 %in% c(2,4:5),NA,val1),
    val2 = val1,
  ) 

tmp.data <- tmp.data %>%
  mutate(
    val2 = ifelse(
      is.na(val2),
      lag(val2) + 1,
      val2
      )
  )

解决方案 1a:假设从之前的缺失值增加,连续缺失 2 行

Using dplyr:

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
         val2 = ifelse(is.na(val2), lag(val2) + 1, val2))

解决方案 1b:假设从之前的缺失值增加,连续缺失 N 行

使用 data.tablezoodplyr

setDT(tmp.data)[, consec := seq_len(.N), by=rleid(val2)]

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
  select(-consec)

或写在一起:

tmp.data %>%
  group_by(rleid(val2)) %>%
  mutate(consec = seq_along(val2)) %>%
  ungroup() %>%
  mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
  select(id, val1, val2)

解决方案 2:不假设从之前的缺失值增加

使用 dplyrzoo:

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), na.locf(val2) + 1, val2))