我试图根据另一个嵌套框架中的case_when函数列表,将case_when应用于嵌套框架_1中的选定列.

例如,使用mtars数据帧:

mpg cyl
21 6
21 6
22.8 4

我想使用下面的框架(框架_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"'))

variable function_to_use
mpg case_when(mpg == 21 ~ "A", mpg == 22.8 ~ "B"
cyl case_when(cyl == 6 ~ "X", cyl == 4 ~ "Y"

预期结果将是:

mpg cyl
A X
A X
B Y

我希望使用DataFrame_2动态完成此操作.

我已经try 了下面的代码.

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)))

编辑:问题的延伸.

我的括号实际上是列表中的括号:

dataframe_1 <- list(dataframe_1a = mtcars[1:3, c("mpg", "cyl")], dataframe_1b = mtcars[4:6, c("mpg", "cyl")])
dataframe_2 <- list(dataframe_2a = 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_2b = data.frame(variable = c(c("mpg", "cyl")), function_to_use = c('case_when(mpg > 21 ~ "A", TRUE ~ "B"',
'case_when(cyl >7 ~ "X", TRUE ~ 4 ~ "Y"'))

我将如何将每个函数应用于它们各自的数据帧对?我试过使用map2,但没有成功.谢谢你的帮助!

推荐答案

使用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

EDIT对于更一般的问题,您可以将代码包装在一个函数中,然后使用purrr::map2循环数据框列表:

library(purrr)
library(dplyr, warn = FALSE)
library(rlang)

myfun <- function(x, y) {
  x |>
    purrr::reduce2(
      y$variable, y$function_to_use,
      \(x, y, z) mutate(x, across(all_of(y), ~ !!!rlang::parse_exprs(z))),
      .init = _
    )
}

purrr::map2(dataframe_1, dataframe_2, myfun)
#> $dataframe_1a
#>               mpg cyl
#> Mazda RX4       A   X
#> Mazda RX4 Wag   A   X
#> Datsun 710      B   Y
#> 
#> $dataframe_1b
#>                   mpg cyl
#> Hornet 4 Drive      A   Y
#> Hornet Sportabout   B   X
#> Valiant             B   Y

R相关问答推荐

R的法国工作日

在之前合并的数据.tables中分配新列后.internal.selfref无效

如何按行和列组合多个格式?

如何设置搜索栏来搜索整个Shiny应用程序页面?

feature_weights参数没有影响Xgboost

提取rame中对应r中某个变量的n个最小正值和n个最大负值的条目

从开始时间和结束时间导出时间

在不安装软件包的情况下测试更新

使用tidy—select创建一个新的带有mutate的摘要变量

gganimate在使用shadow_mark选项时不保留所有过go 的标记

在GGPLATE中将突出的点放在前面

如何在R中对深度嵌套的tibbles中的非空连续行求和?

根据列A中的差异变异列,其中行由列B中的相对值标识

在不丢失空值的情况下取消列出嵌套列表

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

如何从向量构造一系列双边公式

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

有没有办法一次粘贴所有列

带RStatix的Wilcoxon环内检验

如何从嵌套数据中自动创建命名对象?在R中