如何在R语言循环中用$符号将数据框列代入lm公式?
嘿,我来帮你搞定这个R语言里动态代入列名到lm公式的问题!先看看你代码里的几个小问题,再给你俩靠谱的解决方案:
先修正代码里的基础错误
list的定义出错了:你写的as.character("var1","var2")是错的,as.character只接受单个向量参数,应该改成list_cols <- c("var1","var2")(这里把变量名换成list_cols是为了避免和R内置的list()函数重名,减少混淆)。df1$list[2]的写法不成立:$符号后面只能直接写列名的字面量,不能放变量,所以这种写法会找不到名为list的列,自然报错。
解决方案1:用[[索引获取列
[[可以接受字符变量作为列名,完美解决$不能用变量的问题,修正后的循环代码如下:
df1 <- data.frame(id1 = c(1, 2, 3, 4, 5), id2 = c(1, 2, 3, 4, 5), var1 = c(3,6,6,9,5), var2 = c(1, 1, 0, 0, 1)) rownames(df1)<-c("first","second","third","fourth","fifth") trait <- c("id1","id2") list_cols <- c("var1","var2") for(i in trait){ fit <- lm(df1[,i] ~ df1[[list_cols[2]]]) # 可以在这里加代码查看拟合结果,比如: # print(summary(fit)) }
解决方案2:动态构建公式字符串
如果更习惯lm(因变量 ~ 自变量, data=数据框)的直观写法,可以用paste把变量名拼成公式字符串,再转成公式对象,代码如下:
df1 <- data.frame(id1 = c(1, 2, 3, 4, 5), id2 = c(1, 2, 3, 4, 5), var1 = c(3,6,6,9,5), var2 = c(1, 1, 0, 0, 1)) rownames(df1)<-c("first","second","third","fourth","fifth") trait <- c("id1","id2") list_cols <- c("var1","var2") # 建议用列表保存每个模型,避免循环覆盖 fit_list <- list() for(i in seq_along(trait)){ # 构建公式字符串,比如当i=1时,字符串是"id1 ~ var2" formula_str <- paste(trait[i], "~", list_cols[2]) fit_list[[trait[i]]] <- lm(as.formula(formula_str), data = df1) # 打印当前拟合的公式和结果示例 print(paste("正在拟合:", formula_str)) print(summary(fit_list[[trait[i]]])) } # 之后可以通过fit_list$id1或fit_list[[1]]调用对应模型
这种方法的公式形式和平时手动写的完全一致,可读性更强。
内容的提问来源于stack exchange,提问作者Olympia
相关产品推荐
相关产品推荐

