Home > Back-end >  tidy eval map over column names
tidy eval map over column names

Time:10-13

I have made my own function as follows:

    emp_term_var <- function(data, colName, year = "2015") {
  
  # Terminations by year and variable in df
  colName <- enquo(colName) 
  term_test <- data %>%
    filter(year(DateofTermination) == year) %>%
    group_by(UQ(colName)) %>%
    count(UQ(colName)) %>%
    clean_names()
  return(term_test)
  
}

I have a df with multiple columns such as Department, State, Position etc. WHen I want to use the function I have written I put the name of the column without quotations as follows:

emp_term_var(data = df, colName = Department, year = "2015")

Which returns:

# A tibble: 5 x 2
# Groups:   department [5]
  department               n
  <chr>                <int>
1 Admin Offices            1
2 IT/IS                    4
3 Production              15
4 Sales                    1
5 Software Engineering     2
> 

How can I map over mulitple columns? if I try

columns <- c(Department, State)

R does not lelt me as it identifies these as objects and not column names. How can I make R know that these are column names to be stored in the object columns so I can pass it to map in this form:

map(colnames, ~ emp_term_var(df, colName = .x, year = "2015"))

CodePudding user response:

Instead of using enquo change it to either .data or convert to symbols with ensym and evaluate (!!)

emp_term_var <- function(data, colName, year = "2015") {
  
  # Terminations by year and variable in df
  colName <- ensym(colName) 
  term_test <- data %>%
    filter(year(DateofTermination) == year) %>%
    #group_by(!!colName)) %>%
    count(!!(colName)) %>%
    clean_names()
  return(term_test)
  
}

NOTE: count can take the column without any grouping as well

The advantage with ensym route is that it can both quoted and unquoted input i.e. it takes the string as column names and without the quotes

nm1 <- c("Department", "State")
purrr::map(nm1, ~ emp_term_var(df, colName = !!.x, year = "2015"))

or if we want to use

emp_term_var(data = df, colName = Department, year = "2015")

Or can take

emp_term_var(data = df, colName = "Department", year = "2015")
  • Related