基于另一数据框的case_when函数列表动态处理列及列表扩展问题
动态应用
case_when规则转换数据框列 单数据框场景
示例数据与需求
给定mtcars的子集:
| mpg | cyl |
|---|---|
| 21 | 6 |
| 21 | 6 |
| 22.8 | 4 |
需要通过dataframe_2中定义的case_when规则,对指定列进行转换,得到结果:
| mpg | cyl |
|---|---|
| A | X |
| A | X |
| B | Y |
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)
失败原因分析
- 原
across用法不符合语法规范:across要求第一个参数是列选择器,第二个参数是统一的转换函数,无法直接绑定多列对应不同的表达式。 - 规则字符串存在语法错误:原代码中
case_when未闭合括号、逻辑表达式写错(如TRUE ~ 4 ~ "Y"),导致解析失败。 - 列表场景未正确封装转换逻辑:直接使用
map2时未将规则解析与转换步骤封装为函数,导致表达式无法正确传递。
内容的提问来源于stack exchange,提问作者Jo Lo
相关产品推荐
相关产品推荐

