Declaring variables inside mutate

Viewed 65

I am trying to declare the variables inside mutate using all_of but not getting proper output

asd <- data.frame(Col1 = c("A","B"), Col2 = c("R","E"))
a1 <- "Col1"

When I perform below operations, I get invalid output

asd %>% mutate(q1 = case_when(all_of(a1) == "A" ~ 1))
  Col1 Col2 a1
1    A    R NA
2    B    E NA

Expected Output

asd %>% mutate(q1 = case_when(Col1 == "A" ~ 1))
  Col1 Col2 q1
1    A    R  1
2    B    E NA
3 Answers

Or we could use glue::glue just bear in mind that whatever you put inside curly braces will be evaluate as R code:

library(glue)

asd %>%
  mutate(q1 = case_when(
    eval(parse(text = glue("{a1}"))) == "A" ~ 1
  ))

  Col1 Col2 q1
1    A    R  1
2    B    E NA

Wrap it in get()

R> asd %>% mutate(q1 = case_when(all_of(get(a1)) == "A" ~ 1))
  Col1 Col2 q1
1    A    R  1
2    B    E NA

We could use across

library(dplyr)
library(stringr)
asd %>% 
   mutate(across(all_of(a1), ~ case_when(. == 'A' ~ 1),
    .names = "{str_replace(.col, '.*', 'q1')}"))
  Col1 Col2 q1
1    A    R  1
2    B    E NA
Related