2016-08-24 28 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