重复相同的命令 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")
我正在尝试将同一个命令重复 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")