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
相关产品推荐
相关产品推荐

