重复相同的命令 x 次

Repeating the same command for x number of times

我正在尝试将同一个命令重复 x 次,一个简单的例子是读取同名但不同年份的文件 10 次,我可以这样做

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 )
}

由于左侧的原因而无法使用,还有这个

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 )
}

我想问的是,我将不得不每年处理我的数据,这意味着每年分配更多的重复命令。

我们可以使用sprintf创建'files'和'filenames'

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")