根据另一个数据帧中的函数列表将 case_when 应用于数据帧

问题描述 投票:0回答:1

我正在尝试根据另一个数据框中的 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)))
r dplyr case
1个回答
0
投票

使用

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
© www.soinside.com 2019 - 2024. All rights reserved.