2016-08-24 78 views
1

我试图重复x次相同的命令,一个简单的例子是读取同名但不同年份的文件10次,我可以做到这一点重复x次相同的命令

yr2001detail<-read.csv("E:/yr2001detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2002detail<-read.csv("E:/yr2002detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2003detail<-read.csv("E:/yr2003detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2004detail<-read.csv("E:/yr2004detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2005detail<-read.csv("E:/yr2005detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2006detail<-read.csv("E:/yr2006detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2007detail<-read.csv("E:/yr2007detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2008detail<-read.csv("E:/yr2008detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2009detail<-read.csv("E:/yr2009detail.csv",stringsAsFactors = FALSE,header=TRUE) 
yr2010detail<-read.csv("E:/yr2010detail.csv",stringsAsFactors = FALSE,header=TRUE) 

这是不好的,因为我重复自己,而且如果有太多的文件或如果我不得不重复太多次,它是非常耗时的。我曾尝试探索做

for(i in 1:10){ 
paste("yr",2000+i,"detail",sep="")<-read.csv(paste("E:/yr",2000+i,"detail.csv",sep=""),stringsAsFactors = FALSE,header=TRUE) 
} 

其中didnt,因为左侧的工作,也是这个

vector <- rep(NA,10) 
for(i in 1:10){ 
vector[i] <- paste("yr",2000+i,"detail",sep="") 
} 
for(i in 1:10){ 
vector[i]<-read.csv(paste("E:/yr",2000+i,"detail.csv",sep=""),stringsAsFactors = FALSE,header=TRUE) 
} 

我问为沿途进一步下跌,我将不得不应付我的数据每年这意味着为每年分配更多重复的命令。

回答

4

我们可以使用sprintf创建“文件”和“文件名”

files <- sprintf("E:/yr%ddetail.csv", 2001:2010) 
filenames <- sprintf("yr%ddetail", 2001:2010) 

甚至paste可用于

files <- paste0("E:/", 2001:2010, "detail.csv") 
filenames <- paste0("yr", 2001:2010, "detail") 

,然后遍历文件阅读。如果我们需要独立的物体,使用assign

for(j in seq_along(filenames)){ 
    assign(filenames[j], read.csv(files[j], stringsAsFactors=FALSE, header=TRUE)) 
} 

然而,最好是在list阅读它,而不是在全球环境中有许多对象,即

lst <- setNames(lapply(files, read.csv, stringsAsFactors=FALSE, header=TRUE), filenames) 

还是一个更快的选项与fread

library(data.table) 
lst <- setNames(lapply(files, fread), filenames) 

在阅读list,我们也可以将rbind这些数据集合在一起,并有一个'id'列来指明它来自哪个文件。这在几个操作中很有用。

dt <- rbindlist(lst, idcol="Grp") 
+1

感谢您的评论,解决方案的第一部分是我正在寻找的东西,即使它混乱了gobal环境,我想要点击进入对象的选项与列表相比。这是很好的,因为我可以使用其他功能,例如一次对所有数据进行子集化,而不是使用子集注释10次。 – Donkeykongy