这是数据分析师一直在做的事情(特别是在处理具有缺失响应的调查数据时).通常首先将一组竞争数据矩阵相乘,将模型拟合到每个矩阵,然后组合结果.目前我正在手工做事并寻找更优雅的解决方案.
试想一下,有5个*.csv文件在工作目录中,命名为dat1.csv,dat2.csv,... dat5.csv.我想使用每个数据集估计相同的线性模型.
鉴于这个答案,第一步是收集文件列表,我将使用以下内容
csvdat <- list.files(pattern="dat.*csv")
Run Code Online (Sandbox Code Playgroud)
现在我想做点什么
for(x in csvdat) {
lm.which(csvdat == "x") <- lm(y ~ x1 + x2, data = x)
}
Run Code Online (Sandbox Code Playgroud)
"which"语句是我试图依次为每个模型编号的愚蠢方式,使用csvdat列表中的循环当前的位置.也就是说,我想这个循环返回一组5个流明的对象与名称lm.1,lm.2等
是否有一些简单的方法来创建这些对象,并命名它们,以便我可以轻松指出它们对应的数据集?
谢谢你的帮助!
chl*_*chl 10
使用列表来存储回归模型的结果,例如
foo <- function(n) return(transform(X <- as.data.frame(replicate(2, rnorm(n))),
y = V1+V2+rnorm(n)))
write.csv(foo(10), file="dat1.csv")
write.csv(foo(10), file="dat2.csv")
csvdat <- list.files(pattern="dat.*csv")
lm.res <- list()
for (i in seq(along=csvdat))
lm.res[[i]] <- lm(y ~ ., data=read.csv(csvdat[i]))
names(lm.res) <- csvdat
Run Code Online (Sandbox Code Playgroud)
Ram*_*ath 10
另一种方法是使用plyr包来进行循环.使用@chl构造的示例,您将如何执行此操作
require(plyr)
# read csv files into list of data frames
data_frames = llply(csvdat, read.csv)
# run regression models on each data frame
regressions = llply(data_frames, lm, formula = y ~ .)
names(regressions) = csvdat
Run Code Online (Sandbox Code Playgroud)
你想要的是功能seq_along()和组合assign()
seq_along如果有五个对象,则可以帮助创建从1到5的向量csvdat(以获取适当的数字,而不仅仅是变量名称).然后assign(使用paste从数字创建适当的astrings)可以创建变量.
请注意,您还需要先加载数据文件(在您的示例中缺少):
for (x in seq_along(csvdat)) {
data.in <- read.csv(csvdat[x]) #be sure to change this to read.table if necessary
assign(paste("lm.", x, sep = ""), lm(y ~ x1 + x2, data = data.in))
}
Run Code Online (Sandbox Code Playgroud)
seq_along 并非完全必要,可能有其他方法来解决计算问题.
关键功能是assign.使用assign,您可以使用基于字符串的名称创建变量.有关?assign详细信息,请参阅
在chl的评论(见他的帖子)之后,所有内容都在一行中:
for (x in seq_along(csvdat)) assign(paste("lm", x, sep = "."), lm(y ~ x1 + x2, data = read.csv(csvdat[x]))
Run Code Online (Sandbox Code Playgroud)