Rlang-ing in your rocking chair

Programming with dplyr

Dr. Chester Ismay

Educator, Data Scientist, and R/Python Consultant

Strange summarize column name

grouped_mean_by_column <- function(group_col, col_to_mean) {
  joined %>% 
    group_by(!!enquo(group_col)) %>% 
    summarize(mean(!!enquo(col_to_mean)))
}
grouped_mean_by_column(group_col = year, col_to_mean = perc_cvd_crd_70)
# A tibble: 17 × 2
    year `mean(perc_cvd_crd_70)`
   <dbl>                   <dbl>
 1  2000                    15.8
 2  2001                    23.3
...
17  2016                    15.8
Programming with dplyr

What we'd like it to be

# A tibble: 17 × 2
    year mean_of_perc_cvd_crd_70
   <dbl>                   <dbl>
 1  2000                    15.8
 2  2001                    23.3
 3  2002                    15  
 4  2003                    14.8
 5  2004                    21.1
...
15  2014                    16.7
16  2015                    16.0
17  2016                    15.8
Programming with dplyr

as_name() and the walrus operator :=

as_name()

  • Converts unquoted, defused column name to be a string

:=

  • Allows for a variable in R to be on the left-hand side in mutate()
Programming with dplyr

Wrapping up the function

grouped_mean_by_column <- function(.data, group_col, col_to_mean) {

name_of_col_to_mean <- as_name(enquo(col_to_mean))
new_col_name <- paste0("mean_of_", name_of_col_to_mean)
.data %>% group_by(!!enquo(group_col)) %>%
summarize(!!new_col_name := mean(!!enquo(col_to_mean))) }
Programming with dplyr

Applying the wrapped up function

grouped_mean_by_column(.data = joined,
                       group_col = continent,
                       col_to_mean = perc_rural_pop)
# A tibble: 5 × 2
  continent mean_of_perc_rural_pop
  <fct>                      <dbl>
1 Africa                      65.1
2 Americas                    28.1
3 Asia                        31.9
4 Europe                      30.1
5 Oceania                     14.1
Programming with dplyr

Cleaning things up a bit

grouped_mean_by_column <- function(.data, group_col, col_to_mean) {
  name_of_col_to_mean <- as_name(enquo(col_to_mean))
  new_col_name <- paste0("mean_of_", name_of_col_to_mean)
  .data %>% 
    group_by({{ group_col }}) %>% 
    summarize(!!new_col_name := mean({{ col_to_mean }}))
}

joined %>% grouped_mean_by_column(group_col = continent, col_to_mean = perc_rural_pop)
Programming with dplyr

Let's practice!

Programming with dplyr

Preparing Video For Download...