传入列名字符串调用R的ROSE函数处理不平衡数据报错,求解决方案
问题解决:ROSE函数中字符串列名传递错误
核心问题分析
- 函数名拼写错误:你定义的函数是
process_ROSE_imbalanced_data,但调用时写成了process_ROSE_imbalance(缺少末尾的d),这会导致函数调用失败。 - 参数传递不匹配:
rlang::enquo()用于捕获裸变量名(即不带引号的列名,如cancer_class),但你传入的是字符串'cancer_class',导致enquo无法正确解析变量,最终ROSE函数找不到对应的列。
解决方案
方案1:修改函数支持字符串输入(推荐)
使用rlang::sym()将字符串转换为符号,再注入到公式中:
process_ROSE_imbalanced_data <- function(class_var, train_input){ # 把字符串列名转为符号 class_sym <- rlang::sym(class_var) # 注入到ROSE的公式里 rose_result <- ROSE(!!class_sym ~ ., data = train_input)$data return(rose_result) }
调用时保持传字符串(注意修正函数名):
balanced_train <- process_ROSE_imbalanced_data('cancer_class', train_frame)
方案2:直接构造公式字符串
无需rlang,通过字符串拼接生成公式:
process_ROSE_imbalanced_data <- function(class_var, train_input){ # 拼接公式字符串并转为公式对象 rose_formula <- as.formula(paste(class_var, "~ .")) rose_result <- ROSE(rose_formula, data = train_input)$data return(rose_result) }
调用方式同上。
方案3:调用时传入裸变量名
如果不想修改函数,调用时直接传不带引号的列名:
# 修正函数名+传裸变量名 balanced_train <- process_ROSE_imbalanced_data(cancer_class, train_frame)
验证结果
运行修正后的代码后,可通过table(balanced_train$cancer_class)查看平衡后的类别分布,结果应接近1:1的均衡状态。
内容的提问来源于stack exchange,提问作者Mdhale
相关产品推荐
相关产品推荐

