【问题标题】:R: IF statement in dplyr::filter requires ELSE otherwise fails?R: dplyr::filter 中的 IF 语句需要 ELSE 否则会失败?
【发布时间】:2020-11-04 13:59:25
【问题描述】:

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

没有适用于类对象的“filter_”方法 “空”

恕我直言,这是相当具有误导性的,因为我没有使用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.

可以使用 else 从过滤器中生成输出,方法是选择包含所有结果的过滤器约束。

mtcars %>% filter(if (!is.na(a)) cyl == a else carb > 0

可能有一个更好的包罗万象的过滤器约束,实际上可能是一种更优雅的方法,但我找不到其他人发现了这个问题,所以如果没有其他问题,希望我的进步能够满足@987654322 @。

任何有关这是否是错误或其他解决方法的情报,都非常欢迎。谢谢。

【问题讨论】:

    标签: r if-statement filter dplyr


    【解决方案1】:

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

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

    为了回答您的问题,是的,if 需要 else 部分,因为没有它,它只会返回 NULL,这将在 filter 中失败。看这个例子:

    num <- 2
    a <- if(num > 1) 'yes'
    a
    #[1] "yes"
    a <- if(num > 3) 'yes'
    a
    #NULL
    

    因此当你使用

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

    实际发生的是

    mtcars %>% filter(NULL)
    

    返回相同的错误信息。

    【讨论】:

    • 说得通,再次感谢 Ronak。 else TRUE 是一个很好的解决方案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多