Package: dplyr


Function: filter()


  • Note: Using dplyr::across() in dplyr::filter() is deprecated. dplyr::if_any() and dplyr::if_all() are predicate functions used to select columns within dplyr::filter(). This function is available in version 1.0.5 of dplyr. dplyr::if_any() returns a true when the statement is true for any of the variables. dplyr::if_all() returns a true when the statement is true for all of the variables. See Filter using if_all or if_any for further explanation


1. Return rows where form is empty (denoted by ““), but ANY values for variables (var1:var4) are NOT missing (denoted by”MR” as well as NA).

Review the data (d17)

# A tibble: 8 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    10 "a"   3     4     3     3    
2    11 "b"   3     MR    2     1    
3    12 "b"   <NA>  3     1     MR   
4    13 ""    MR    MR    MR    MR   
5    14 ""    <NA>  <NA>  <NA>  <NA> 
6    15 ""    1     MR    3     MR   
7    17 ""    MR    <NA>  <NA>  <NA> 
8    18 "a"   MR    MR    <NA>  <NA> 
  • Note: You’ll notice here that I did NOT use %in% to keep NA values for var1:var4. Remember from Filter rows with NA values, NA values are not evaluated and are dropped automatically when you use !=. In this case, since both “MR” and NA are missing values, I am okay with NA values being dropped by default.
d17 %>%
  filter(form == "" & dplyr::if_any(var1:var4, ~ . != "MR"))
# A tibble: 1 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    15 ""    1     MR    3     MR   

I could get the same outcome by being more explicit and using this formula instead.

d17 %>%
  filter(form == "" & dplyr::if_any(var1:var4, ~ !. %in% c("MR", NA)))
# A tibble: 1 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    15 ""    1     MR    3     MR   

Or using something like this.

d17 %>%
  filter(form == "" & dplyr::if_any(var1:var4, ~ !(. == "MR"|is.na(.))))
# A tibble: 1 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    15 ""    1     MR    3     MR   

Or I could also get the same result this way, where I am saying “return the rows where form is missing but ALL values for variables (var1:var4) are not missing.”

d17 %>%
  filter(form == "" & !dplyr::if_all(var1:var4, ~ . %in% c("MR", NA)))
# A tibble: 1 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    15 ""    1     MR    3     MR   

2. Return rows where form is not empty, and ALL variables (var1:var4) are empty.

Review the data (d17)

# A tibble: 8 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    10 "a"   3     4     3     3    
2    11 "b"   3     MR    2     1    
3    12 "b"   <NA>  3     1     MR   
4    13 ""    MR    MR    MR    MR   
5    14 ""    <NA>  <NA>  <NA>  <NA> 
6    15 ""    1     MR    3     MR   
7    17 ""    MR    <NA>  <NA>  <NA> 
8    18 "a"   MR    MR    <NA>  <NA> 
d17 %>%
  filter(form != "" & dplyr::if_all(var1:var4, ~ . %in% c("MR", NA)))
# A tibble: 1 x 6
     id form  var1  var2  var3  var4 
  <dbl> <chr> <chr> <chr> <chr> <chr>
1    18 a     MR    MR    <NA>  <NA> 

Return to Filter