lm 在列表的元素上

lm on element of a list

假设我有一个包含三个数据框的列表

set.seed(55)
df1 <- data.frame(a=rnorm(6), b=rnorm(6), c=rnorm(6))
df2 <- data.frame(a=rnorm(6), b=rnorm(6), c=rnorm(6))
df3 <- data.frame(a=rnorm(6), b=rnorm(6), c=rnorm(6))
l <- list(df1, df2, df3)

我现在喜欢用每个数据帧的 a 和 c 做一个线性模型。我尝试了以下

for(i in l) {
  x <- (lm(l[[i]]$a~l[[i]]$c))
}

但是我收到以下错误

Error in l[[i]] : invalid subscript type 'list'

我想要一个列表,其中每个元素都是 a 和 c 的 lm。任何帮助,将不胜感激。非常感谢!

你可以用一个简单的 lapply 来做到这一点,就像这样:

lapply(l, lm, formula = a ~ c)

如果您想保留您建议的格式(for 循环),您需要在 for 循环语句中使用类似 1:length(l) 的内容。

此外,如果您一直将内容分配给 x,您将不断覆盖它。在下面的内容中,我将线性模型分配给字母表中的第 24、25 和 26 个字母,因此您有一个名为 x、y 和 z 的 lm。其他建议的解决方案更简洁。

for(i in 1:length(l)) {
 assign(letters[24:26][i], (lm(l[[i]]$a~l[[i]]$c)))
}

公认的答案是首选,但它可能对来自 for-loop 心态的人有用,被告知 lapply 解决方案(至少它的结果被分配给 'x') 等同于:

x<-list();
for(i in seq_along(l) ) {
      x[[i]] <- lm(a~c, data=l[[i]])
    }