无法使用dplyr lag函数填充2个相关行

无法使用dplyr lag函数填充2个相关行,r,dplyr,lag,R,Dplyr,Lag,我使用R和R包dplyr。 我希望在数据框中填充上一行值中缺少的值(增加1)。如果间隙为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

我使用R和R包dplyr。 我希望在数据框中填充上一行值中缺少的值(增加1)。如果间隙为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
      )
  )
库(dplyr)
tmp.data%
变异(
val1=ifelse(在%c(2,4:5)中的val1%,NA,val1),
val2=val1,
) 
tmp.data%
变异(
val2=ifelse(
is.na(val2),
滞后(val2)+1,
瓦尔2
)
)

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

使用dplyr

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
         val2 = ifelse(is.na(val2), lag(val2) + 1, val2))
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)
解决方案1b:假设从先前缺失的值增加,连续缺失N行

使用
data.table
zoo
dplyr

tmp.data %>%
  mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
         val2 = ifelse(is.na(val2), lag(val2) + 1, val2))
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:不假设从先前缺失的值增加

使用
dplyr
zoo

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

尝试在“dplyr”包中使用“if_else”是否要为缺少的值填充4和5,还是要填充4和4?@kath值:4和5。我想要4和5,我的意思是从先前已增加的值中获取。更新了我的代码。这是一个非常临时的解决方案。你需要更通用的吗?是的,我需要更通用的。缺少的行可以是任意整数。解决方案1b还需要包zoo。但它确实有效。