R - 在 ifelse 语句中处理 NA



这个问题与这个问题略有相似,但更具理论成分。

给出如下 df:

varA <- c(1,0,0,NA,NA)
varB <- c(NA,NA,NA,1,0)
df <- data.frame(varA, varB)
varA varB
1    NA
0    NA
0    NA
NA    1
NA    0

生成结合了varAvarB信息的var(考虑到NA)的最优雅的方法是什么?

varA varB var
1    NA   1
0    NA   0
0    NA   0
NA    1   1
NA    0   0

我现在的方法如下:

df$var[df$varA == 1 | df$varB == 1] <- 1
df$var[df$varA == 0 | df$varB == 0] <- 0

作为一个附带问题,R 如何处理ifelse语句中的 NA?例如,如果我编写以下代码,它不会产生我想要的输出。

df$var <- ifelse(df$varA == 1 | df$varB == 1, 1, 
ifelse(df$varA == 0 | df$varB == 0, 0, NA)

结合了来自 varA 和 varB 的信息

似乎您正在寻找coalesce

library(dplyr)
df %>% mutate(var = coalesce(varA, varB))
#  varA varB var
#1    1   NA   1
#2    0   NA   0
#3    0   NA   0
#4   NA    1   1
#5   NA    0   0

出于您的目的,NA 等同于 0,那么为什么不将它们转换为 0?

df[is.na(df)] <- 0
df$var <- with(df, as.integer(varA | varB))
> df
varA varB var
1    1    0   1
2    0    0   0
3    0    0   0
4    0    1   1
5    0    0   0

我们可以使用pmax

df$var <- do.call(pmax, c(df, na.rm = TRUE))
df$var
#[1] 1 0 0 1 0

最新更新