I have data frame as:
df=data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100),y3=...)
I want to run a loop which regresses each column starting from the second column on the first column:
for(i in names(df[,-1])){
model = lm(i~x, data=df)
}
But I failed. The point is that I want to do a loop of regression for each column and some column names is just a number (e.g. 404.1). I cannot find a way to run a loop for each column using the above command.
Your code looks fine except when you call i
within lm
, R will read i
as a string, which you can't regress things against. Using get
will allow you to pull the column corresponding to 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)
}
I create an empty list storage
, which I'm going to fill up with each iteration of the loop. It's just a personal preference but I'd also advise against how you've written your current loop:
for(i in names(df[,-1])){
model = lm(i~x, data=df)
}
You will overwrite model
, thus returning only the last iteration results. I suggest you change it to a list, or a matrix where you can iteratively store results.
Hope that helps
Another solution with broom and 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)
来源:https://stackoverflow.com/questions/42464767/how-to-run-lm-regression-for-every-column-in-r