2012-12-18 11 views
12

Sono molto nuovo alla programmazione con R, ma sto cercando di leggere più file per una directory e dare a ognuno un nome univoco. Sto leggendo i file usando la libreria di programmi di Dendrocronologia in R (pacchetto dpIR) e la funzione read.tucson. Sebbene io stia utilizzando un pacchetto specifico, ritengo che la mia domanda sia abbastanza generale:Come rinominare un data-frame in un ciclo

All'interno del ciclo, voglio creare file concatenando uno "t" con ciascun nome di file. Quindi, se ho un file chiamato "2503" nella mia directory, voglio creare un dataframe in R chiamato "t2503". Successivamente, voglio leggere i dati usando la funzione r.tucson in ogni dataframe. Piuttosto che assegnare i dati letti al dataframe, sto semplicemente sovrascrivendo la concatenazione con i dati. Qualcuno può aiutarmi a capire quale passo mi manca?

Ecco il codice che sto cercando di utilizzare:

#set to appropriate directory 
setwd("C:/work") 

#get a list of files in the directory 
files <- list.files() 
numfiles <- length(files) 

for (i in 1:numfiles) 
{ 
    name<-paste("t",files[i],sep="") 
    name<-read.tucson(files[i],header=NULL) 
} 

risposta

24

penso che hai dato la risposta da soli: è necessario utilizzare ?assign.

provare qualcosa di simile:

for (i in 1:5) { 
    assign(paste0("DF", i), data.frame(A=rnorm(10), B=rnorm(10))) 
} 

Questo loop attraverso gli interi da 1 a 5 e crea cinque data.frames "DF1" a "DF5". Per il vostro esempio, si deve solo sostituire

name<-read.tucson(files[i],header=NULL) 

con

assign(name, read.tucson(files[i],header=NULL)) 

Si noti, tuttavia, che name è una funzione di base nel campo della R, quindi vorrei usare un'altra convenzione di denominazione o semplicemente saltare la prima riga:

assign(paste("t",files[i],sep=""), read.tucson(files[i],header=NULL)) 

Spero che questo sia quello che stai cercando.

+0

Grazie per il vostro aiuto! Ho provato a utilizzare "assegna" come hai delineato qui e ha fatto esattamente ciò di cui avevo bisogno. Grazie! – user1913921

+5

ATTENZIONE: quando si usa 'assign' in una funzione si comporta diversamente dal suo utilizzo al livello più alto, prima o poi è necessario' env = .GlobalEnv'. – user1666959

+0

Questo è un buon consiglio. Se l'OP vuole ulteriori informazioni al riguardo, può dare un'occhiata [qui] (http://stackoverflow.com/questions/9801208/assign-a-function-in-a-loop). –