【发布时间】:2018-11-04 00:15:33
【问题描述】:
我想使用相同的通用mutate 创建三个新变量(称为one、two 和three),但在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 问题,您有两个对应的向量和一个函数,该函数成对地从两个向量中获取项目。
这是我(失败的)尝试在 funs 参数中使用 map2:
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 %>% 管道中,而不创建命名函数或破坏管道。
【问题讨论】: