【问题标题】:R: How can I use loop variable i in the extract symbol $ of a dataframe?R:如何在数据帧的提取符号 $ 中使用循环变量 i?
【发布时间】:2025-12-16 19:55:01
【问题描述】:

例如,假设一个数据框 df 由 3 个变量 v1,v2,v3 组成。

v1=rnorm(10,mean=1,sd=2)
v2=rnorm(10,mean=2,sd=2)
v3=rnorm(10,mean=3,sd=2)
df=data.frame(v1,v2,v3)

现在我想用for循环做线性回归:

for (i in names(df)){
  fit <- lm(i~.,data=df)
}

这里出现了一个错误。我想要的是从 v1 到 v3 运行循环变量 i,但是循环变量 i 实际上是“v1”到“v3”。我该如何处理?

我知道一些其他的方法,例如在公式中使用 df[,i] 代替 i,但是,当我使用 newdata 进行预测时,会导致错误:

train <- df[1:5,]
test <- df[6:10,]

for (i in names(df)){
  fit <- lm(train[,i]~.,data=train)
  predict<- predict(fit,newdata=test[,!(colnames(test) %in% i)])
}

另外,我真的很想用~。而不是 ~v2+v3,因为实际上我有 200 个变量。

真心希望得到您的回复!

【问题讨论】:

    标签: r for-loop linear-regression


    【解决方案1】:

    计算语言:

    for (i in names(df)){
      y <- as.name(i)
      fit <- eval(bquote(lm(.(y) ~ ., data = train)))
      predict <- predict(fit, newdata = test)
    }
    

    【讨论】:

    • print(fit) 中的公式与您从@jlesuffleur 的答案中得到的公式进行比较。我的解决方案更安全,因为它避免了潜在的范围问题。
    【解决方案2】:

    使用formula

    for (i in names(df)){
      form <- formula(paste0(i, "~."))
      fit <- lm(form, data = df)
    }
    

    【讨论】:

    • 感谢您发布答案。它运作良好!很抱歉我的声誉低于 15,因此投票不显示。