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

问题描述

|| 这是数据分析员一直在做的事情(尤其是在处理具有缺失响应的调查数据时)。通常先对一组竞争数据矩阵进行乘法运算,将模型拟合到这些矩阵中的每一个,然后合并结果。目前,我正在手动处理事务,并寻求更优雅的解决方案。 想象一下工作目录中有5个
*.csv
文件,分别是
dat1.csv
dat2.csv
,...
dat5.csv
。我想使用每个数据集来估计相同的线性模型。 有了这个答案,第一步是收集文件列表,我将使用以下方法
csvdat <- list.files(pattern=\"dat.*csv\")
现在我想做类似的事情
for(x in csvdat) {
    lm.which(csvdat == \"x\") <- lm(y ~ x1 + x2,data = x)
}
\“ which \”语句是我尝试通过循环当前使用的csvdat列表中的位置依次编号每个模型的愚蠢方法。也就是说,我希望此循环返回一组名称为
lm.1
lm.2
等的5 lm对象 是否有一些简单的方法可以创建这些对象并为其命名,以便我可以轻松地指出它们对应的数据集? 谢谢你的帮助!     

解决方法

另一种方法是使用“ 8”包进行循环。使用@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
    ,使用列表来存储您的回归模型的结果,例如
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
    ,您想要的是功能
seq_along()
assign()
的组合 如果
csvdat
中有五个对象,13ѭ将帮助创建一个从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
并非完全必要,可以有其他方法解决计算问题。 关键功能是ѭ15。使用assign,您可以使用基于字符串的名称创建变量。有关更多信息,请参见
?assign
。 按照chl的评论(请参阅他的帖子),将所有内容一行一行显示:
for (x in seq_along(csvdat)) assign(paste(\"lm\",sep = \".\"),data = read.csv(csvdat[x]))
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...