使用R,循环数据帧,并为循环中创建的对象分配适当的名称

tom*_*omw 8 r

这是数据分析师一直在做的事情(特别是在处理具有缺失响应的调查数据时).通常首先将一组竞争数据矩阵相乘,将模型拟合到每个矩阵,然后组合结果.目前我正在手工做事并寻找更优雅的解决方案.

试想一下,有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)


Hen*_*rik 8

你想要的是功能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)