dez*_*000 3 if-statement r filter dplyr
根据其他答案,可以if在管道和函数中包含语句dplyr。然而对于filter,似乎需要使用 anelse而不仅仅是 an if,否则filter将不返回任何内容,调用错误:
没有适用于“filter_”的方法应用于类“NULL”的对象
恕我直言,这是相当误导的,因为我没有使用filter_也没有亲自向管道提供 NULL 类对象。最小代表:
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.
Run Code Online (Sandbox Code Playgroud)
通过选择将包括所有结果的过滤器约束,可以使用 else 从过滤器生成输出。
mtcars %>% filter(if (!is.na(a)) cyl == a else carb > 0
Run Code Online (Sandbox Code Playgroud)
可能有一个更好的包罗万象的过滤器约束,实际上可能有一种更优雅的方法来做到这一点,但我找不到其他人发现这个问题,所以如果没有别的,希望我的进展能达到其通常的目的。
任何有关这是否是错误的信息,或其他解决此问题的方法,都非常受欢迎。谢谢。
我们可以返回TRUE条件else,该条件将选择所有行,以防条件依赖于FALSE或不依赖于我们正在测试的列中的值。
library(dplyr)
a <- NA
mtcars %>% filter(if(!is.na(a)) cyl == a else TRUE)
Run Code Online (Sandbox Code Playgroud)
并回答你的问题,是的if需要else部分,因为如果没有它,它只会返回NULL,并且会失败filter。看这个例子:
num <- 2
a <- if(num > 1) 'yes'
a
#[1] "yes"
a <- if(num > 3) 'yes'
a
#NULL
Run Code Online (Sandbox Code Playgroud)
因此当你使用
a <- NA
mtcars %>% filter(if(!is.na(a)) cyl == a)
Run Code Online (Sandbox Code Playgroud)
实际发生的情况是
mtcars %>% filter(NULL)
Run Code Online (Sandbox Code Playgroud)
它返回相同的错误消息。