Conditional filtering using tidyverse

Viewed 7697

I want to filter my data frame based on a variable that may or may not exist. As an expected output, I want a df that is filtered (if it has the filter variable), or the original, unfiltered df (if the variable is missing).

Here is a minimal example:

library(tidyverse)
df1 <- 
tribble(~a,~b,
        1L,"a",
        0L, "a",
        0L,"b",
        1L, "b")
df2 <- select(df1, b)

Filtering on df1 returns the required result, a filtered tibble.

filter(df1, a == 1)
# A tibble: 2 x 2
      a     b
  <int> <chr>
1     1     a
2     1     b

But the second one throws an error (expectedly), as the variable is not in the df.

filter(df2, a == 1)
Error in filter_impl(.data, quo) : 
  Evaluation error: object 'a' not found.

I tried filter_at, which would be an obvious choice, but it throws an error if there is no variable that matches the predicament.

filter_at(df2, vars(matches("a")), any_vars(. == 1L))    
Error: `.predicate` has no matching columns

So, my question is: is there a way to create a conditional filtering that produces the expected outcome, preferably within the tidyverse?

2 Answers
Related