【发布时间】:2018-02-21 01:03:38
【问题描述】:
我想根据可能存在或不存在的变量过滤我的数据框。作为预期输出,我想要一个经过过滤的 df(如果它具有 filter 变量),或者是原始的、未过滤的 df(如果该变量丢失)。
这是一个最小的例子:
library(tidyverse)
df1 <-
tribble(~a,~b,
1L,"a",
0L, "a",
0L,"b",
1L, "b")
df2 <- select(df1, b)
对df1 进行过滤会返回所需的结果,即过滤后的小标题。
filter(df1, a == 1)
# A tibble: 2 x 2
a b
<int> <chr>
1 1 a
2 1 b
但第二个抛出错误(预期),因为变量不在 df 中。
filter(df2, a == 1)
Error in filter_impl(.data, quo) :
Evaluation error: object 'a' not found.
我尝试了filter_at,这将是一个显而易见的选择,但如果没有与困境匹配的变量,则会引发错误。
filter_at(df2, vars(matches("a")), any_vars(. == 1L))
Error: `.predicate` has no matching columns
所以,我的问题是:有没有办法创建一个条件过滤来产生预期的结果,最好是在 tidyverse 中?
【问题讨论】:
-
我认为这个问答stackoverflow.com/questions/44001722/…应该回答你的问题
-
预期结果是什么?
-
例如(在链接的 Q 中),您可以执行
df2 %>% filter(if("a" %in% names(.)) a == 1 else TRUE)或df2 %>% {if("a" %in% names(.)) filter(., a == 1) else .}之类的操作 -
@JanvanderLaan OP 想要返回原始数据,如果变量不存在(“原始的、未过滤的 df(如果变量丢失)。”)
-
你不能把它包装在
try或tryCatch中吗?或者您希望能够在管道链中使用它?