filter()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 explanation1. 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>
%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