我总共有46个回归模型,我想在数据表中总结一下。这是我创建的一个虚拟示例,用于帮助解释我的方法论。
#Dummy data
Data1 <- data.frame(flow = c(8,8.5,6,7.1,9), SP_elev = c(20,11,5,25,50))
Data2 <- data.frame(flow = c(7,7.2,6.5,8.2,8.5), SP_elev = c(13,15,18,25,19))
Data3 <- data.frame(flow = c(2,3,5,7,9), SP_elev = c(20,25,28,30,35))
Data4 <- data.frame(flow = c(1,4,6,8,9), SP_elev = c(13,15,18,25,19))
Data5 <- data.frame(flow = c(1,4,6,8,9), SP_elev = c(13,15,18,25,19))
Data6 <- data.frame(flow = c(1,4,6,8,9), SP_elev = c(22,23,25,27,29))
#Create blank data frame with desired column names
tmp <- data.frame(matrix(nrow=0, ncol=9))
names(tmp) <- c("site_name","int", "coflin", "cofsqd", "fstat", "ldf", "udf", "cod", "pval")
#Create Vector list
dataframes = list("Data1" = Data1,
"Data2" = Data2,
"Data3" = Data3,
"Data4" = Data4,
"Data5" = Data5,
"Data6" = Data6)
#plot a with regression model
for (i in dataframes) {
#Create regression model
fit2<-lm(SP_elev ~ flow + I(flow^2), data=i)
pol2 <- function(x) fit2$coefficient[3]*x^2 + fit2$coefficient[2]*x + fit2$coefficient[1]
#Create variables for each coefficient
site_name <- i
int <- signif(summary(fit2)$coefficients[1],4)
coflin <- signif(summary(fit2)$coefficients[2],4)
cofsqd <- signif(summary(fit2)$coefficients[3],4)
fstat <- signif(summary(fit2)$fstatistic,4)
ldf <- signif(summary(fit2)$fstatistic[2],2)
udf <- signif(summary(fit2)$fstatistic[3],2)
cod <- signif(summary(fit2)$adj.r.squared,3)
pval <- signif(pf(fstat,ldf,udf,lower.tail=FALSE),4
#add variables to the dataframe 'tmp'
}
目前我的方法是:
运行for循环以对每个数据集执行回归分析。
一个。格式化相应的变量以添加到数据框tmp
湾将格式化的变量逐行附加到数据框tmp
(i
每个虚拟数据集的行)
如上所示,我不太清楚如何将变量添加到数据框tmp
。
答案 0 :(得分:1)
如果将循环更改为计数器而不是实际的数据框对象,则这变得非常简单:
tmp <- data.frame(matrix(nrow=length(dataframes), ncol=9))
names(tmp) <- c("site_name","int", "coflin", "cofsqd", "fstat", "ldf", "udf", "cod", "pval")
for(j in seq_along(dataframes)) {
i <- dataframes[[j]]
# rest of your code goes here
new.row <- c(names(dataframes)[[j]], int, coflin, ..., cod, pval)
tmp[j, ] <- new.row
}
请注意您如何使用i
作为ID,因为这是一个数据框,但您可以使用相应的名称。此外,我们将结果数据框初始化为行数的正确大小。
需要注意的一点是,修改数据帧的速度很慢,因此您通常不希望在循环中执行此操作,除非您的循环没有多次迭代。如果是这样,一个简单的解决方案是首先使用矩阵,并在完成循环后将其转换为数据帧。