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

问题描述

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

所有缺失的案例必须符合以下标准:

如果缺少实际变量并且 如果 下一个变量是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 环境解释这一点,我会很高兴。

非常感谢!

编辑:如果您在这里查看答案,欢迎您!但是您也可以使用Function / Loop 将 NA 替换为 R 中相邻列中的值。非常感谢!

标签: rloopsfor-looptidyversemissing-data

解决方案


可能我们需要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

推荐阅读