You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言使用lapply循环列调用lmer时报object not found错误

错误原因

你代码报错的核心是参数位置放置错误:data、na.action是lmer()的入参,不属于公式的组成部分,不需要参与substitute()的变量替换。你将这两个参数放到了substitute()的替换列表中,导致lmer()没有接收到指定的数据集,默认到全局环境查找对应列名,才会报对象不存在的错误,和数据框内是否存在该列无关。

修正后代码

适配你提供的示例数据版本

# 先加载依赖包
library(lme4)

set.seed(43)
n <- 6
dat <- data.frame(id=1:n, Status=rep(LETTERS[1:2], n/2), age= sample(18:90, n, replace=TRUE), match=1:n, Acetatifactor=runif(n), Acutalibacter=runif(n), Adlercreutzia=runif(n))

varlist = names(dat)[5:ncol(dat)]
result <- lapply(varlist, function(x){
  # substitute仅负责生成公式,lmer的其他参数直接平级传入
  form <- substitute(i ~ Status + (1|match), list(i = as.name(x)))
  lmer(form, data = dat, na.action = na.exclude)
})

更易维护的替代写法

用reformulate()生成公式,不需要处理表达式替换,逻辑更清晰,不易出错:

result <- lapply(varlist, function(x){
  form <- reformulate(termlabels = c("Status", "(1|match)"), response = x)
  lmer(form, data = dat, na.action = na.exclude)
})

适配你原始需求的版本(对应Genus_abundance数据集)

library(lme4)
varlist=names(Genus_abundance)[5:ncol(Genus_abundance)]

lapply(varlist, function(x){
  form <- substitute(i ~ Status + (1|Match), list(i=as.name(x)))
  lmer(form, data=Genus_abundance, na.action = na.exclude)
})

注意:请检查随机效应项的Match大小写和你数据框中的列名完全一致,避免额外报错。

内容的提问来源于stack exchange,提问作者Fiona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:09:03