这个问题与这个问题略有相似,但更具理论成分。
给出如下 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
生成结合了varA
和varB
信息的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