在循环/函数中使用pROC::roc()避免错误的方法
解决循环/函数中向
pROC::roc()传递参数的问题 针对变量名含空格的场景,以下几种方法可以解决你遇到的variable lengths differ报错:
示例数据(模拟带空格的变量名)
library(pROC) # 构造测试数据 df <- data.frame( response = factor(sample(c(0,1), 100, replace = TRUE)), `Variable One` = rnorm(100), `Variable Two` = rnorm(100), `Variable Three` = rnorm(100) ) # 提取需要分析的变量名(排除response) var_names <- setdiff(names(df), "response")
方法1:直接提取数据列(最稳妥)
跳过变量名解析,直接传递数据框的列向量,完全规避空格变量名的语法问题:
roc_list <- lapply(var_names, function(var) { roc(response = df$response, predictor = df[[var]], quiet = TRUE) }) # 给列表命名便于后续索引 names(roc_list) <- var_names
方法2:公式语法结合符号注入
用rlang工具将字符串变量名转为符号,注入公式中:
library(rlang) roc_list <- lapply(var_names, function(var) { # 构建公式:response ~ 带空格的变量 roc_formula <- response ~ !!sym(var) roc(roc_formula, data = df, quiet = TRUE) }) names(roc_list) <- var_names
如果不想依赖rlang,也可以用字符串拼接生成公式:
roc_list <- lapply(var_names, function(var) { roc_formula <- as.formula(paste("response ~", paste0("`", var, "`"))) roc(roc_formula, data = df, quiet = TRUE) })
方法3:使用pROC::roc_()(标准评估版本)
roc_()是roc()的标准评估接口,直接接受字符串形式的变量名:
roc_list <- lapply(var_names, function(var) { roc_(response = "response", predictor = var, data = df, quiet = TRUE) }) names(roc_list) <- var_names
报错原因说明
你之前遇到的variable lengths differ,是因为直接将字符串变量名(如i)传给roc()的predictor参数时,函数会把字符串本身当成长度为1的向量,和长度为100的response向量不匹配。必须将变量名转换为数据框对应的列向量,或是通过公式/标准评估接口让函数正确识别变量。
内容的提问来源于stack exchange,提问作者jared_mamrot
相关产品推荐
相关产品推荐

