You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一数据框的case_when函数列表动态处理列及列表扩展问题

动态应用case_when规则转换数据框列

单数据框场景

示例数据与需求

给定mtcars的子集:

mpgcyl
216
216
22.84

需要通过dataframe_2中定义的case_when规则,对指定列进行转换,得到结果:

mpgcyl
AX
AX
BY

dataframe_2的定义(修正原代码语法错误,补全case_when闭合括号):

dataframe_2 <- data.frame(
  variable = c("mpg", "cyl"),
  function_to_use = c(
    'case_when(mpg == 21 ~ "A", mpg == 22.8 ~ "B")',
    'case_when(cyl == 6 ~ "X", cyl == 4 ~ "Y")'
  )
)

问题与失败尝试

尝试以下代码未成功:

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_2中的规则解析为命名表达式列表,每个列名对应其转换规则,再通过mutate(!!!expr_list)直接替换原列:

library(dplyr)
library(purrr)
library(rlang)

# 解析规则为命名表达式列表
expr_list <- setNames(map(dataframe_2$function_to_use, parse_expr), dataframe_2$variable)

# 应用转换到目标数据
mtcars_sub <- mtcars[1:3, c("mpg", "cyl")]
result_single <- mtcars_sub %>% mutate(!!!expr_list)

多数据框列表扩展场景

场景定义

数据框与规则均为列表形式(修正原代码语法错误):

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("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("mpg", "cyl"),
    function_to_use = c(
      'case_when(mpg > 21 ~ "A", TRUE ~ "B")',
      'case_when(cyl >7 ~ "X", TRUE ~ "Y")'
    )
  )
)

解决方案

定义转换函数,结合map2遍历配对的数据框与规则:

# 定义批量转换函数
apply_case_when <- function(df, rule_df) {
  expr_list <- setNames(map(rule_df$function_to_use, parse_expr), rule_df$variable)
  df %>% mutate(!!!expr_list)
}

# 批量处理配对数据
result_list <- map2(dataframe_1, dataframe_2, apply_case_when)

失败原因分析

  1. 原across用法不符合语法规范:across要求第一个参数是列选择器,第二个参数是统一的转换函数,无法直接绑定多列对应不同的表达式。
  2. 规则字符串存在语法错误:原代码中case_when未闭合括号、逻辑表达式写错(如TRUE ~ 4 ~ "Y"),导致解析失败。
  3. 列表场景未正确封装转换逻辑:直接使用map2时未将规则解析与转换步骤封装为函数,导致表达式无法正确传递。

内容的提问来源于stack exchange,提问作者Jo Lo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:58