R:dplyr::filter中的IF语句需要ELSE,否则失败?

R:dplyr::filter中的IF语句需要ELSE,否则失败?,r,if-statement,filter,dplyr,R,If Statement,Filter,Dplyr,根据,可以在管道和dplyr函数中包含if语句。但是对于过滤器,似乎需要使用else而不仅仅是if,否则过滤器将不返回任何内容,并调用错误: 没有适用于类的对象的“筛选器”的方法 “空” 这相当误导IMHO,因为我没有使用过滤器,也没有亲自向管道提供空类对象。Min reprex: data(mtcars) a <- 1 mtcars %>% filter(if (a == 1) cyl == 6) # if in filter works a <- NA mtcars %&g

根据,可以在管道和
dplyr
函数中包含
if
语句。但是对于
过滤器
,似乎需要使用
else
而不仅仅是
if
,否则
过滤器
将不返回任何内容,并调用错误:

没有适用于类的对象的“筛选器”的方法 “空”

这相当误导IMHO,因为我没有使用
过滤器
,也没有亲自向管道提供空类对象。Min reprex:

data(mtcars)
a <- 1
mtcars %>% filter(if (a == 1) cyl == 6) # if in filter works
a <- NA
mtcars %>% filter(if (is.na(a)) cyl == 6) # is.na in if in filter works if it evaluates to true
a <- 4
mtcars %>% filter(if (!is.na(a)) cyl == a) # !is.na works if it evaluates to true
a <- NA
mtcars %>% filter(if (!is.na(a)) cyl == a) # doesn't work if it evaluates to false
# Input `..1` must be of size 32 or 1, not size 0.
可能有一个更好的“全包过滤器”约束,实际上可能是一种更优雅的方法,但我找不到任何其他人发现这个问题,所以如果没有其他问题,希望我的进步能起到作用


任何关于这是否是一个错误的英特尔,或其他方法来处理这一问题,最受欢迎。谢谢。

我们可以在
else
条件中返回
TRUE
,如果条件为
FALSE
,它将选择所有行,并且不依赖于我们正在测试的列中的值

library(dplyr)
a <- NA
mtcars %>% filter(if(!is.na(a)) cyl == a else TRUE)
因此,当您使用

a <- NA
mtcars %>% filter(if(!is.na(a)) cyl == a)

返回相同的错误消息。

我们可以在
else
条件中返回
TRUE
,该条件将在条件为
FALSE
时选择所有行,并且不依赖于我们正在测试的列中的值

library(dplyr)
a <- NA
mtcars %>% filter(if(!is.na(a)) cyl == a else TRUE)
因此,当您使用

a <- NA
mtcars %>% filter(if(!is.na(a)) cyl == a)

返回相同的错误消息。

有道理,再次感谢Ronak
else TRUE
是一个简洁的解决方案:)有道理,再次感谢Ronak
else TRUE
是一个简洁的解决方案:)
mtcars %>% filter(NULL)