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