for 循环替换以下一个变量为条件的缺失案例(tidyverse 解决方案将不胜感激)

Loop of for to replace missing cases conditional on the next variable (tidyverse solution will be appreciated)

一如既往,我是在查看了大量有关编码的信息后才来到这里的。 让我解释一下我现在面临的情况:我正在研究旨在获得儿童发展的心理量表。在这个比例中,我们不可能遗漏案例,只有 0、1 或 2。不幸的是,人们用缺失编码了一些值,我正在努力解决这个问题。

所有缺失的个案必须满足以下条件:

如果实际变量缺失 AND 如果下一个变量是2,那么缺失的就是“2”; 如果下一个变量是1,那么缺失的就是“1”, 如果下一个变量是 0,则缺失值将是“0”

脚本中不会包含最后一列。

谈论起来很容易,但编写代码对我来说是个挑战。

我的直觉编码是这样说的:

for (i in 1:ncol(ds)) {
  if(is.na(ds[i]) & ds[i+1] == "2") ds[i] == "2"
}

您可以重现的代码是:

ds <- data.frame(x1 = rep(sample(0:2),5), 
                 x2 = sample(0:2),
                 x3 = sample(0:2),
                 x4 = sample(0:2))
ds[ds == 0] <- NA

for (i in 1:ncol(ds)) {
  if(is.na(ds[i]) & ds[i+1] == "2") ds[i] == "2"
}

澄清一下,我知道 tidyverse(扫帚)在这种情况下非常有用,如果有人能解释一下使用 tidyverse 环境,我会很高兴。

非常感谢!

已编辑:如果您是来这里检查答案的,欢迎!但是你也可以去 。非常感谢!

可能我们需要fill

library(tidyverse)
ds %>% 
  fill(everything(), .direction = 'up')

如果我们想对每一行都这样做,那么使用apply

library(zoo)
ds[] <- t(apply(ds, 1, function(x) na.locf(x, fromLast = TRUE, na.rm = FALSE)))

pmap

pmap(ds, ~ c(...) %>%
             as_tibble %>%
             fill(value, .direction= 'up')) %>% 
   bind_cols %>%
   t %>%
   as_tibble