目标:使用ifelse语句评估下面的两个单独的列var1和var2,以创建第三个复合列,下面是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
答案 0 :(得分:3)
只是为了解释为什么你的版本不起作用:NA == NA
不是TRUE
,而是NA
- 从概念上说这是有道理的,通常我们想知道两个值是相同的,如果我们不知道其中的一个或两个,我们都不知道它们是否相同。要测试值是否为NA
,您需要使用函数is.NA()
。这是一个简单的版本:
df_addvar3 <- df %>%
mutate(var3 = ifelse(is.na(var1), var2, var1))
如果值与-1:1不同,或者如果var1和var2都不是NA,但彼此不同,那么您的问题并不十分清楚。如有必要,所有这些都应该相对简单。
答案 1 :(得分:0)
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