2016-08-24 2 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) 
} 

, который не работал из-за левой стороны, а также это

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, мы также можем установить набор данных вместе с одним и иметь столбец «id», чтобы указать, из какого файла он пришел. Это может быть полезно в нескольких операциях.

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

спасибо за ваш комментарий, то первая часть решения является то, что я искал, даже если он загромождает Gobal среды, я хотел бы возможность нажать на объект на данный момент по сравнению с списком. это замечательно, так как я могу использовать другие fuctions, такие как подмножество всех данных одновременно, вместо использования комментария 10 подмножества. – Donkeykongy

Смежные вопросы