列名含特殊字符时的R循环回归报错问题及修正需求
含空格列名的循环线性回归问题解决
问题背景
需将数据框第一列(Canada Price)依次与后续列执行一元线性回归(如Canada Price ~ Global Price、Canada Price ~ Canada 2Y Bond Price),但原代码因列名含空格报错,且不清楚如何处理.x对应的自变量列名空格问题。
原报错代码:
lm.test <- map_dfr( set_names(names(df)), ~ tidy(lm(as.formula(paste("`",colnames(df[1]),"`","~", .x)), data = df)), .id = "predictor")
提供的测试数据:
df1 <- structure(list( `Canada Price` = c(-0.030661468, -0.034269304, 0.02371464, -0.007971484, 0.005342716, -0.002210376, 0.018338299, 0.000662471, 0.002124411, 0.034191555, -0.011470069, 0.007039847, -0.028872959, 0.009244373, 0.017448201, -0.002379819, -0.002103406, 0.019154969, -0.00124318, -0.001241636), `Global Price` = c(-0.000207995, -0.140212141, 0.019987, 0.090597341, 0.060627149, 0.046010712, 0.019799534, -0.025356047, 0.045979342, 0.043211347, -0.033773176, 0.050327089, -0.004501371, -0.00092413, -0.010638258, 0.050111674, 0.03094893, 0.08307375, -0.054526954, 0.003319001), `Canada 2Y Bond Price` = c(0.084, 0.363, -0.781, -0.221, 0.151, -0.106, 0.036, 0.523, -0.433, -0.08, 0.396, -0.052, 0.324, 0.166, -0.179, 0.352, 0.121, 0.051, 0.345, -0.289), `US - Canada Inflation` = c(-0.075, -1.062, 0.273, 0.068, 0.234, 0.13, 0.005, 0.045, 0.282, 0.147, -0.037, 0.151, -0.214, -0.066, 0.053, -0.161, 0.106, 0.149, 0.032, 0.219), `Oil Price` = c(0.002116, -0.06122, 0.209895, -0.10657, -0.22191, 0.073975, 0.058091, -0.03765, 0.365933, 0.113365, -0.09753, 0.145487, 0.064282, 0.076961, 0.108548, -0.11261, 0.130575, 0.041074, 0.079687, 0.100941)), class = "data.frame", row.names = c(NA, -20L))
错误原因
- 自变量列名未包裹反引号:仅给因变量加了反引号,但
.x对应的含空格自变量(如Global Price)未被包裹,导致公式解析失败。 - 包含无效回归项:
set_names(names(df))将第一列(因变量)也纳入循环,会生成Canada Price ~ Canada Price的无效回归。
修正方案
方案1:手动拼接公式时统一包裹反引号
library(tidyverse) library(broom) # 筛选自变量列:排除第一列 predictor_cols <- names(df1)[-1] lm.test <- map_dfr( set_names(predictor_cols), # 给因变量和自变量都包裹反引号 ~ tidy(lm(as.formula(paste0("`", colnames(df1[1]), "` ~ `", .x, "`")), data = df1)), .id = "predictor" )
方案2:使用reformulate函数(推荐)
reformulate函数可自动处理含特殊字符的列名,无需手动拼接字符串,代码更简洁安全:
lm.test <- map_dfr( set_names(predictor_cols), ~ tidy(lm(reformulate(.x, response = colnames(df1[1])), data = df1)), .id = "predictor" )
关键调整说明
- 用
names(df1)[-1]筛选自变量列,避免因变量自身参与回归。 - 方案1中通过
paste0给.x也包裹反引号,确保含空格的列名被R正确识别。 - 方案2的
reformulate函数直接接受列名字符串,自动处理空格等特殊字符,减少手动拼接的出错概率。
内容的提问来源于stack exchange,提问作者sjedi
相关产品推荐
相关产品推荐

