我的数据框为:
df=data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100),y3=...)
我想运行一个循环,从第一列的第二列开始对每列进行回归:
for(i in names(df[,-1])){
model = lm(i~x, data=df)
}
但我失败了。关键是我想为每列做一个回归循环,一些列名只是一个数字(例如404.1)。我找不到使用上面的命令为每列运行循环的方法。
答案 0 :(得分:0)
您的代码看起来不错,除非您在i
内拨打lm
,R会将i
作为字符串读取,您无法对其进行回归。使用get
可以提取与i
对应的列。
df=data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100),y3=rnorm(100))
storage <- list()
for(i in names(df)[-1]){
storage[[i]] <- lm(get(i) ~ x, df)
}
我创建了一个空列表storage
,我将填充循环的每次迭代。这只是个人偏好,但我也建议你不要写你当前的循环:
for(i in names(df[,-1])){
model = lm(i~x, data=df)
}
您将覆盖model
,因此仅返回最后一次迭代结果。我建议你把它改成一个列表,或者你可以迭代存储结果的矩阵。
希望有所帮助
答案 1 :(得分:0)
另一种使用扫帚和tidyverse的解决方案:
library(tidyverse)
library(broom)
df <- data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100))
result <- df %>%
gather(measure, value, -x) %>%
nest(-measure) %>%
mutate(fit = map(data, ~ lm(value ~ x, data = .x)),
tidied = map(fit, tidy)) %>%
unnest(tidied)