如何在回归模型公式中包含含括号的字符串列名?
含括号列名的循环lmer建模报错解决方法
问题背景
导入自Excel的数据框包含带括号的列名,示例数据如下:
df <- data.frame( "ID" = c(233,233,243,243), "Treatment" = c("A1","B1","A1","B1"), "A(secs)" = c(0.1,0.2,0.2,0.1), "B(secs)" = c(0.4,0.5,2,1), check.names = FALSE # 强制保留原始列名,避免自动替换特殊字符 )
尝试循环列名运行随机效应模型时,执行lmer出现错误:Error in A(secs) : could not find function "A";手动添加反斜杠转义后,又出现object 'A(secs)' not found的问题。
原循环代码(存在语法和逻辑问题):
for (i in c("A(secs)","B(secs")){ # 缺少闭合括号 FF_df <- df %>% group_by(Treatment)%>% summarize(mean=mean(!!sym(i)), sem = sd(!!sym(i))/sqrt(n()), n = n(), max = mean + sem, min = mean - sem) formula <- as.formula(paste(i,"~ Treatment + (1| ID)")) model <- lmer(formula,data=df) summary(model) }
问题原因
带括号的列名在公式解析时会被R误认为是函数调用(比如A(secs)会被解析为调用函数A并传入参数secs),而非数据框的列名。直接用反斜杠转义无法适配公式的解析规则。
解决方案
1. 修正循环列表的语法错误
将循环列表中的"B(secs"补充为"B(secs)",确保列名字符串完整。
2. 构造公式时用反引号包裹列名
在拼接公式字符串时,给带特殊字符的列名加上反引号(`),明确告诉R这是一个变量名而非函数。修改公式构造代码:
formula <- as.formula(paste0("`", i, "` ~ Treatment + (1| ID)"))
3. 完整可运行代码
library(lme4) library(dplyr) df <- data.frame( "ID" = c(233,233,243,243), "Treatment" = c("A1","B1","A1","B1"), "A(secs)" = c(0.1,0.2,0.2,0.1), "B(secs)" = c(0.4,0.5,2,1), check.names = FALSE ) for (i in c("A(secs)", "B(secs)")){ # 统计描述 FF_df <- df %>% group_by(Treatment) %>% summarize( mean = mean(!!sym(i)), sem = sd(!!sym(i))/sqrt(n()), n = n(), max = mean + sem, min = mean - sem ) # 构造公式并拟合模型 formula <- as.formula(paste0("`", i, "` ~ Treatment + (1| ID)")) model <- lmer(formula, data = df) # 打印模型结果,避免循环中结果被覆盖 cat("\n=== 针对列", i, "的模型结果 ===\n") print(summary(model)) }
额外提示
- 从Excel导入数据时,建议设置
check.names = FALSE,防止R自动将特殊字符(如括号、空格)替换为点号,保留原始列名。 - 在dplyr管道中使用
!!sym(i)可以正确解析带特殊字符的列名,但公式构造需要单独处理,因为公式的解析规则与tidyeval不同。
内容的提问来源于stack exchange,提问作者JLit98
相关产品推荐
相关产品推荐

