r - R 中 ifelse() 中语句的顺序重要吗

标签 r if-statement

这是我的数据集:

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
<表类=“s-表”> <标题> 一个 b c d e <正文> 1 不适用 不适用 一个 一个 不适用 1 不适用 不适用 B 1 不适用 不适用 一个 一个 1 不适用 不适用 一个 一个 1 1 两者 两者 两者 不适用 1 不适用 不适用 B 不适用 1 不适用 不适用 B 1 1 两者 两者 两者 不适用 1 不适用 不适用 B 1 不适用 不适用 一个 一个 1 不适用 不适用 一个 一个

最佳答案

是的,顺序很重要。从左到右的评估一旦得知结果即停止。

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/

相关文章:

rbindlist 用于缺少水平的因子

r - 如何将数据框 (R) 导出到 Oracle 表中

graphics - 如何找到所有包含图形功能的R包?

r - 无法在 RStudio 中更改 R 的版本

excel - 为多个复选框添加 VBA - 返回编译错误

r - 我如何 reshape 这张 table ?

python - 将 XML 转换为 Python 对象 - 多个 IF 语句

BASH SHELL IF ELSE 在后台运行命令

php - 如果 isset 破坏了我的 php

java - 是否有更有效的方法来比较 If 语句中的 3 个以上项目?