# make example data
set.seed(42)
df <- data.frame(
ind = sample.int(20,20,replace=TRUE),
rate1 = sample.int(20,20,replace=TRUE),
rate2 = sample.int(20,20,replace=TRUE),
rate3 = sample.int(20,20,replace=TRUE),
rate4 = sample.int(20,20,replace=TRUE),
rate5 = sample.int(20,20,replace=TRUE),
rate6 = sample.int(20,20,replace=TRUE),
rate7 = sample.int(20,20,replace=TRUE),
rate8 = sample.int(20,20,replace=TRUE),
rate9 = sample.int(20,20,replace=TRUE),
rate10 = sample.int(20,20,replace=TRUE),
rate11 = sample.int(20,20,replace=TRUE),
rate12 = sample.int(20,20,replace=TRUE),
rate13 = sample.int(20,20,replace=TRUE),
rate14 = sample.int(20,20,replace=TRUE),
rate15 = sample.int(20,20,replace=TRUE),
rate16 = sample.int(20,20,replace=TRUE),
rate17 = sample.int(20,20,replace=TRUE),
rate18 = sample.int(20,20,replace=TRUE),
rate19 = sample.int(20,20,replace=TRUE),
rate20 = sample.int(20,20,replace=TRUE)
)
# possible solution
library(tidyverse)
library(rlang)
library(glue)
case_build <- function(indexvar,cols){
imap_chr(cols,
~ glue("{indexvar} == {.y} ~ {.x}")) %>%
paste0(collapse=",") -> subs
parse_expr(glue("case_when({subs})"))
}
df2 <- df %>%
mutate(outcome = eval(case_build("ind",
paste0("rate",1:20))))