Я хочу создать три новые переменные (назовите их one
, two
и three
), используя тот же обобщенный mutate
, но с другой существующей переменной, используемой внутри mutate
. Для этого я хочу написать блок короткого кода, который выполняет то же самое, что и следующий (подробный) код:
mtcars.modified <- mtcars %>%
mutate(one = factor(case_when(
mpg < 10 ~ "lt10",
mpg >= 10 & mpg <= 20 ~ "10to20",
mpg > 20 ~ "gt20"),
ordered=T, levels = c("lt10", "10to20", "gt20"))) %>%
mutate(two = factor(case_when(
disp < 10 ~ "lt10",
disp >= 10 & disp <= 20 ~ "10to20",
disp > 20 ~ "gt20"),
ordered=T, levels = c("lt10", "10to20", "gt20"))) %>%
mutate(three = factor(case_when(
qsec < 10 ~ "lt10",
qsec >= 10 & qsec <= 20 ~ "10to20",
qsec > 20 ~ "gt20"),
ordered =T, levels = c("lt10", "10to20", "gt20")))
Один из способов обобщить это - использовать суффикс поведения mutate_at
, а затем переименовать:
mtcars.modified <- mtcars %>%
mutate_at(c("mpg", "disp", "qsec"),
funs(mod = factor(case_when(
. < 10 ~ "lt10",
. >= 10 & . <= 20 ~ "10to20",
. > 20 ~ "gt20"),
ordered =T, levels = c("lt10", "10to20", "gt20")))) %>%
rename(one = mpg_mod,
two = disp_mod,
three = qsec_mod)
Хотя это похоже на обходной путь. Есть ли способ, которым я могу сделать это без необходимости rename
после этого? Я подумал, могу ли я дать one
, two
и three
в качестве .vars
и затем каким-то образом передать второй набор переменных в case_when
. Это похоже на проблему map2
, когда у вас есть два соответствующих вектора и функция, которая получает элементы из обоих векторов попарно.
Это была моя (неудачная) попытка использовать map2
в аргументе funs
:
mtcars.modified <- mtcars %>%
mutate_at(c("one", "two", "three"),
funs(map2(.x = ., .y = c(mpg, disp, qsec),
~ factor(case_when(
.y < 10 ~ "lt10",
.y >= 10 & .y <= 20 ~ "10to20",
.y > 20 ~ "gt20"),
ordered =T, levels = c("lt10", "10to20", "gt20")))))
Я бы хотел хранить все внутри mtcars %>%
трубы, не создавая именованную функцию и не разрывая трубу.