我正在尝试根据另一个数据框中的 case_when 函数列表将 case_when 应用于 dataframe_1 中的选定列。
例如,使用 mtcars 数据框:
mpg | 圆柱 |
---|---|
21 | 6 |
21 | 6 |
22.8 | 4 |
我想使用下面的数据框(dataframe_2)来改变列。
dataframe_2 = data.frame(variable = c(c("mpg", "cyl")), function_to_use = c('case_when(mpg == 21 ~ "A", mpg == 22.8 ~ "B"', 'case_when(cyl == 6 ~ "X", cyl == 4 ~ "Y"'))
变量 | 要使用的功能 |
---|---|
mpg | case_when(mpg == 21 ~ "A", mpg == 22.8 ~ "B" |
圆柱 | case_when(cyl == 6 ~ "X", cyl == 4 ~ "Y" |
预期结果是:
mpg | 圆柱 |
---|---|
A | X |
A | X |
B | 是 |
我想使用 dataframe_2 动态地完成此操作。
我已经尝试过以下代码。
mtcars %>% mutate(across(dataframe_2$variable ~ !!!parse_exprs(dataframe_2$function_to_use)))
我注意到下面的代码可以工作,但不会更改原始列。
a <- ‘case_when(mpg == 21 ~ "A", mpg == 22.8 ~ "B"; case_when(cyl == 6 ~ "X", cyl == 4 ~ "Y"‘
mtcars %>% mutate(across(c("mpg", "cyl") ~ !!!parse_exprs(a)))
使用
purrr::reduce2
你可以循环遍历 dataframe_2
的行,如下所示:
注意:您的
case_when
语句漏掉了右括号。
library(purrr)
library(dplyr, warn = FALSE)
dataframe_1 <- mtcars[1:3, c("mpg", "cyl")]
dataframe_2 <- data.frame(
variable = c(c("mpg", "cyl")),
function_to_use = c(
'case_when(mpg == 21 ~ "A", mpg == 22.8 ~ "B")',
'case_when(cyl == 6 ~ "X", cyl == 4 ~ "Y")'
)
)
dataframe_1 |>
purrr::reduce2(
dataframe_2$variable, dataframe_2$function_to_use,
\(x, y, z) mutate(x, across(all_of(y), ~ !!!rlang::parse_exprs(z))),
.init = _
)
#> mpg cyl
#> Mazda RX4 A X
#> Mazda RX4 Wag A X
#> Datsun 710 B Y