创建新列时如何在 ifelse 中处理 NA

How to handle NAs in ifelse when creating new column

目标:评估下面两个单独的列 var1 和 var2,使用 ifelse 语句创建第三个复合列,下面的 var3。例如,我想检查每一列,如果它们都包含 NA,我需要在第三列 var3 中使用 NA。如果 var1 或 var2 包含 -1、0 或 1,我希望它位于 var3

问题:打开所有 NA。我知道评估 NA 存在一些愚蠢的问题,但我想念它。

期望的输出:

var1  var2  var3
  1    NA    1
  NA   1     1
  NA   NA    NA
  NA   -1    -1
  0    NA    0

可重现的例子:

library(tidyverse)

df <- data.frame(var1 = c(1, 1, NA, NA, 0),
                  var2 = c(NA, 1, NA, -1, NA))

df_addvar3 <- df %>%
    mutate(var3 = ifelse(var1 == NA | var2 == NA, NA,
                      ifelse(var1 == -1 | var2 == -1, -1,
                          ifelse(var1 == 0 | var2 == 0, 0,
                              ifelse(var1 == 1 | var2 == 1, 1, NA)))))

df_addvar3
replace(x = df[cbind(1:NROW(df), max.col(replace(df, is.na(df), -Inf)))],
        list = rowSums(is.na(df)) == NCOL(df),
        values = NA)
#[1]  1  1 NA -1  0

只是为了解释为什么你的版本不起作用:NA == NA 不是 TRUE,而是 NA - 从概念上讲这是有道理的,通常我们想知道两个值是否是相同,如果我们不知道其中一个或两个,我们就不知道它们是否相同。要测试一个值是否为 NA,您需要使用函数 is.NA()。这是一个简单的版本:

df_addvar3 <- df %>%
  mutate(var3 = ifelse(is.na(var1), var2, var1))

如果值不同于 -1:1,或者如果 var1 和 var2 都不是 NA,但彼此不同,您的问题不是很清楚您想要发生什么。如果需要,所有这些都应该相对简单地添加。