这是数据分析师一直在做的事情(特别是在使用缺少响应的调查数据时。)通常首先将一组竞争数据矩阵相乘,将模型拟合到每个矩阵,然后组合结果。目前我正在手工做事并寻找更优雅的解决方案。
想象一下,工作目录中有5个*.csv
个文件,名为dat1.csv
,dat2.csv
,... dat5.csv
。我想使用每个数据集估计相同的线性模型。
鉴于this answer,第一步是收集文件列表,我将使用以下内容
csvdat <- list.files(pattern="dat.*csv")
现在我想做一些像
这样的事情for(x in csvdat) {
lm.which(csvdat == "x") <- lm(y ~ x1 + x2, data = x)
}
“which”语句是我试图依次为每个模型编号的愚蠢方式,使用csvdat列表中当前循环所在的位置。也就是说,我希望这个循环返回一组5 lm对象,其名称为lm.1
,lm.2
等
是否有一些简单的方法来创建这些对象,并命名它们以便我可以轻松指出它们对应的数据集?
感谢您的帮助!
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:8)
您想要的是功能seq_along()
和assign()
seq_along
中有五个对象,则 csvdat
会帮助创建1到5的向量(以获取适当的数字,而不仅仅是变量名称)。然后assign
(使用paste
从数字创建适当的字符串)可以创建变量。
请注意,您还需要先加载数据文件(在您的示例中缺少):
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))
}
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]))