2011-01-31 8 views
8

Uno script R molto semplice aggiunge un indice di riga crescente a un file di testo "0.txt" e aggiunge anche un'intestazione "time" ad esso. Dopo che i dati vengono scritti in un file "0-edit.txt"Come eseguire iterazioni sui nomi di file in uno script R?

data<-read.table("0.txt", header=TRUE,sep=",",row.names= NULL); 
colnames(data)[1] = "time" 
write.table(data,quote=FALSE,sep=", ","0-edit.txt"); 

Si supponga che ho 4 file chiamati 0.txt, 1.txt, 2.txt, ... nella stessa cartella, come posso usare un contatore (o qualcos'altro) per iterare su quei nomi di file nel mio script?

risposta

12
for(i in 0:3) { 
    infile <- paste(i,".txt",sep="") 
    outfile <- paste(i,"-edit.txt",sep="") 

    data <- read.table(infile,header=TRUE,sep=",",row.names=NULL) 
    colnames(data)[1] = "time" 
    write.table(data,quote=FALSE,sep=", ",outfile) 
} 
+0

Grazie mille, la funzione Incolla mi ha sfuggito in qualche modo –

+1

@ Martin: Prego. Puoi anche trovare '? File.path' a portata di mano. –

3

Più in generale, è possibile utilizzare dir() per ottenere i file in una determinata directory, e utilizzare select di limitarla a txt file.

file.dir <- "/path/to/files" 
for(infile in dir(file.dir, pattern="\\.txt$")) { 
    outfile <- gsub("\\.txt$","-edit\\.txt", infile) 

    data <- read.table(infile,header=TRUE,sep=",",row.names=NULL) 
    colnames(data)[1] = "time" 
    write.table(data,quote=FALSE,sep=", ",outfile) 
} 
12

Ecco una soluzione senza un ciclo utilizzando lapply:

infiles <- dir(pattern='\\.txt$') 

change.files <- function(file){ 
    data <- read.table(file, header=TRUE, sep=",", row.names=NULL) 
    colnames(data)[1] = "time" 
    write.table(data, quote=FALSE, sep=", ", sub("\\.txt$","-edit.txt", file)) 
} 

lapply(infiles , change.files) 

Per me il vero vantaggio di questo approccio è che si può facilmente eseguire in parallelo utilizzando mclapply (dal pacchetto multi-core) al posto di lapply. O parLapply dalla neve. Anche a me sembra più bello.

+0

Questo è appena diventato utile per un altro compito e devo essere d'accordo, è elegante –

6

Prova questo:

files <- list.files(path="", pattern=".txt", all.files=T, full.names=T) 
for (file in files) { 
## do stuff 
} 

È possibile utilizzare le espressioni regolari per il pattern matching, quindi se avete un sacco di file di testo, ma vogliono solo quelli con nomi numerici, usa "[0-9] .txt "o" [0-3] .txt ".