这是我的数据集:
a <- c(1, NA, 1, 1, 1, NA, NA, 1, NA, 1, 1)
b <- c(NA, 1, NA, NA,1, 1, 1, 1,1, NA, NA)
df <- data.frame(a,b)
我想创建一个新变量,即 当a为1,b为1时,产生“both” 当a为NA,B为1时,产生“B” 当a为1,b为NA时,产生“A”
我不明白,为什么只有最后一 block 代码给了我正确的结果
df$c <- ifelse(df$a ==1 & df$b == 1, "Both",
ifelse(df$a == 1 & is.na(df$b), "A",
ifelse(df$b == 1 & is.na(df$a), "B", NA)))
df$d <- ifelse(df$a ==1 & is.na(df$b), "A",
ifelse(df$a == 1 & df$b==1, "Both",
ifelse(df$b == 1 & is.na(df$a), "B", NA)))
df$e <- ifelse(df$a ==1 & is.na(df$b), "A",
ifelse(df$b ==1 & is.na(df$a), "B",
ifelse(df$b == 1 & df$a == 1, "Both", NA)))
df
最佳答案
是的,顺序很重要。从左到右的评估一旦得知结果即停止。
TRUE & NA
#[1] NA
TRUE | NA
#[1] TRUE
FALSE & NA
#[1] FALSE
FALSE | NA
#[1] NA
如果计算得出 NA
,ifelse
返回 NA
。
ifelse(TRUE, 1, 0)
#[1] 1
ifelse(FALSE, 1, 0)
#[1] 0
ifelse(NA, 1, 0)
#[1] NA
因此使用ifelse
它可能看起来像:
with(df, ifelse(!is.na(a) & a == 1 & !is.na(b) & b == 1, "Both",
ifelse(!is.na(a) & a == 1 & is.na(b), "A",
ifelse(!is.na(b) & b == 1 & is.na(a), "B", NA))))
# [1] "A" "B" "A" "A" "Both" "B" "B" "Both" "B" "A"
#[11] "A"
另一种选择是使用switch
。
sapply(paste(df$a, df$b), switch,
"1 1" = "Both",
"1 NA" = "A",
"NA 1" = "B",
NA)
# 1 NA NA 1 1 NA 1 NA 1 1 NA 1 NA 1 1 1 NA 1 1 NA 1 NA
# "A" "B" "A" "A" "Both" "B" "B" "Both" "B" "A" "A"
关于r - R 中 ifelse() 中语句的顺序重要吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75982230/