R 嵌套的`if_else()`和`is.na()`逻辑不一致?

R 嵌套的`if_else()`和`is.na()`逻辑不一致?,r,dplyr,R,Dplyr,我试图使用mutate和if_else()来获得以下逻辑语句应用于数据帧的两列的结果: 如果a或b中为是,则为True;如果两者均为NA,则为NA;如果两者均为否,则为FALSE;如果两者均为否,则为NA(&N) 库(magrittr) 图书馆(dplyr) 数据帧( “a”=c(NA,“否”,“是”,“是”,“否”,“否”,NA), “b”=c(不适用,“不适用”,“是”,“不适用”,“是”,不适用) ) %>% 变异( 逻辑=如果有其他( a==“是”| b==“是”, 是的, 否则( i

我试图使用
mutate
if_else()
来获得以下逻辑语句应用于数据帧的两列的结果:

如果a或b中为是,则为True;如果两者均为NA,则为NA;如果两者均为否,则为FALSE;如果两者均为否,则为NA(&N)

库(magrittr)
图书馆(dplyr)
数据帧(
“a”=c(NA,“否”,“是”,“是”,“否”,“否”,NA),
“b”=c(不适用,“不适用”,“是”,“不适用”,“是”,不适用)
) %>% 
变异(
逻辑=如果有其他(
a==“是”| b==“是”,
是的,
否则(
is.na(a)和is.na(b),
不,,
错误的
)
)
)
#>逻辑的
#>1 NA
#>2不假不假
#>3是的是真的
#>4是不是真的
#>5不,是真的
#>6无NA
#>7不适用
在最后两行中,我得到了NA not预期结果FALSE。应为,因为
is.na(a)&is.na(b)
应返回FALSE,如下例所示

#此处为假
如有其他情况(is.na(na)&is.na(“否”),na,FALSE)
#>[1]错误
我是否遗漏了
如果其他
工作的方式


由(v0.2.1)于2019-02-06创建,我们需要在第一个
if_else
中添加条件来处理
NA
元素,否则,与
NA
元素的比较返回
NA

df1 %>% 
   mutate(logical = if_else((a == "Yes" & !is.na(a)) |
            (b == "Yes" & !is.na(b)), TRUE, 
      if_else(is.na(a) & is.na(b), NA, FALSE )))
#     a    b logical
#1 <NA> <NA>      NA
#2   No   No   FALSE
#3  Yes  Yes    TRUE
#4  Yes   No    TRUE
#5   No  Yes    TRUE
#6   No <NA>   FALSE
#7 <NA>   No   FALSE

或使用
base R

replace((rowSums(df1 == "Yes", na.rm = TRUE) > 0), rowSums(is.na(df1) == 2, NA)
#[1]    NA FALSE  TRUE  TRUE  TRUE FALSE FALSE
数据
df1您还可以执行以下操作:

library(dplyr)

data.frame(
  "a"=c(NA,"No","Yes","Yes","No","No",NA),
  "b"=c(NA,"No","Yes","No","Yes",NA,"No")
) %>%
  mutate(
    logical = case_when(
      a == "Yes" | b == "Yes" ~ TRUE,
      is.na(a) & is.na(b) ~ NA,
      TRUE ~ FALSE
    )
  )
输出:

     a    b logical
1 <NA> <NA>      NA
2   No   No   FALSE
3  Yes  Yes    TRUE
4  Yes   No    TRUE
5   No  Yes    TRUE
6   No <NA>   FALSE
7 <NA>   No   FALSE
ab逻辑
1 NA
2不假不假
3是的是真的
4是不是真的
5不,是真的
6不假
7不假

我同意这是一个更具可读性的解决方案,我不知道当
看起来非常有用时,@akrun的回答清楚了为什么我所做的不起作用;他的回答符合这个问题。然而,我个人的观点是,如果您使用的是
dplyr
,嵌套的
ifelse
if\u else
没有什么意义,因此我总是尝试以这种方式回答-很高兴在
时了解
案例对您有帮助!
library(dplyr)

data.frame(
  "a"=c(NA,"No","Yes","Yes","No","No",NA),
  "b"=c(NA,"No","Yes","No","Yes",NA,"No")
) %>%
  mutate(
    logical = case_when(
      a == "Yes" | b == "Yes" ~ TRUE,
      is.na(a) & is.na(b) ~ NA,
      TRUE ~ FALSE
    )
  )
     a    b logical
1 <NA> <NA>      NA
2   No   No   FALSE
3  Yes  Yes    TRUE
4  Yes   No    TRUE
5   No  Yes    TRUE
6   No <NA>   FALSE
7 <NA>   No   FALSE