Is there a way to run dplyr functions over a set of predefined variables?

Viewed 53
df <- mtcars

prop <- df %>%
  group_by(cyl, .drop = FALSE) %>%
  filter(rowMeans(is.na(across(c(disp,  drat, wt)))) <= 0.5) %>%
  summarise(N = n(), across(c(disp, drat, wt, qsec, vs), ~mean(. == 1, na.rm=TRUE))) %>%
  select(disp,  drat, wt, qsec, vs)

Is there a way to run filter(), summarise() and select() over an external vector like:

select1 <- df %>% select(disp,  drat, wt)
select2 <- df %>% select(disp,  drat, wt, qsec, vs)

instead of defining the respective variables every time to reduce the susceptibility to errors?

for example summarise(N = n(), across(all_of(select2)), ~mean(. == 1, na.rm=TRUE)) %>% gives me an error.

Thanks!

1 Answers

Using !! from {rlang}

library(rlang)
library(dplyr)

df <- mtcars

select1 <- df %>% select(disp, drat, wt) %>% names()
select2 <- df %>% select(disp, drat, wt, qsec, vs) %>% names()

df %>%
    group_by(cyl, .drop = FALSE) %>%
    filter(rowMeans(is.na(across(!!select1))) <= 0.5) %>%
    summarise(N = n(), across(!!select2, ~ mean(. == 1, na.rm = TRUE))) %>%
    select(!!select2)

#> # A tibble: 3 × 5
#>    disp  drat    wt  qsec    vs
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     0     0     0     0 0.909
#> 2     0     0     0     0 0.571
#> 3     0     0     0     0 0

Created on 2022-07-12 by the reprex package (v2.0.1)

Related