R-创建新列时如何处理IFELSE中的NAS



目标:在下面评估两个单独的列,即var1和var2,并使用IFELSE语句创建第三个复合列,下面的VAR3。例如,我想检查每一列,如果它们都包含Na,则在第三列中需要NA,VAR3。如果VAR1或VAR2包含-1、0或1,我希望它是在Var3

问题:出现所有NAS。我知道评估NAS存在一些愚蠢的问题,但我缺少它。

所需的输出:

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

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

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

如果值与-1:1不同,或者VAR1和VAR2都不是NA,而是彼此不同的,那么您的问题就不清楚您想发生的事情。所有这些都应相对简单,如有必要。

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

最新更新