Qual è il metodo migliore per applicare ripetutamente uno script a n file .csv in R?

La mia situazione :

  1. Ho un numero di file CSV tutti con lo stesso suffisso pre .csv, ma i primi due caratteri del nome del file sono diversi (ad esempio AA01.csv, AB01.csv, AC01.csv etc)
  2. Ho uno script R che vorrei eseguire su ogni file. Questo file estrae essenzialmente i dati dal file .csv e li assegna ai vettori / li converte in oggetti timeeries. (Ad esempio, AA01 xts object timeseries, object AB01 xts)

Cosa vorrei ottenere :

  1. Incorporare lo script all’interno di un ciclo più grande (o come appropriato) per eseguire in sequenza su ciascun file e applicare lo script
  2. Rimuovi gli oggetti intermedi creati (vedi lo snippet di codice sotto)
  3. Lasciami con gli ultimi oggetti xts creati da ciascun file di dati non elaborati (ad esempio da AA01 a AC01 ecc. Come valori / vettori ecc.)

Quale sarebbe il modo giusto per incorporare questo script in R? Scusa, ma sono un programmatore noob!

Il mio codice di script sotto … l’intestazione di ogni colonna in ciascun CSV è DATA, ORA, VALORE

# Pull in Data from the FileSystem and attach it AA01raw<-read.csv("AA01.csv") attach(AA01raw) #format the data for timeseries work cdt<-as.character(Date) ctm<-as.character(Time) tfrm<-timeDate(paste(cdt,ctm),format ="%Y/%m/%d %H:%M:%S") val<-as.matrix(Value) aa01tsobj<-timeSeries(val,tfrm) #convert the timeSeries object to an xts Object aa01xtsobj<-as.xts(tsobj) #remove all the intermediate objects to leave the final xts object rm(cdt) rm(ctm) rm(aa01tsobj) rm(tfrm) gc() 

e quindi ripetere su ogni file .csv fino a quando tutti gli oggetti xts vengono estratti.

cioè, quello che vorremmo finire in R, pronto per ulteriori applicazioni sono:

 aa01xtsobj, ab01xtsobj, ac01xtsobj....etc 

qualsiasi aiuto su come farlo sarebbe molto apprezzato.

Trovo che un ciclo for e liste sia abbastanza buono per cose come questa. Una volta che hai un set di codice funzionante è abbastanza facile passare da un loop a una funzione che può essere sapply o simile, ma quel tipo di vettorizzazione è comunque idiosincratico e probabilmente non utile al di fuori delle one-line private.

Probabilmente vorrete evitare di assegnare a più oggetti con nomi diversi nello spazio di lavoro (questa una FAQ che di solito si presenta come “come assegno () …”).

Si prega di fare attenzione al mio codice non testato.

Un vettore di nomi di file e un elenco con un elemento denominato per ogni file.

 files <- c("AA01.csv", "AA02.csv") lst <- vector("list", length(files)) names(lst) <- files 

Passa sopra ogni file.

 library(timeSeries) for (i in 1:length(files)) { ## read strings as character tmp <- read.csv(files[i], stringsAsFactors = FALSE) ## convert to 'timeDate' tmp$tfrm <- timeDate(paste(tmp$cdt, tmp$ctm),format ="%Y/%m/%d %H:%M:%S")) ## create timeSeries object obj <- timeSeries(as.matrix(tmp$Value), tmp$tfrm) ## store object in the list, by name lst[[files[i]]] <- as.xts(obj) } ## clean up rm(tmp, files, obj) 

Ora tutti gli oggetti di lettura sono in lst , ma è necessario verificare che il file sia disponibile, che sia stato letto correttamente e che si desideri modificare i nomi in modo che siano più sensibili del solo nome del file.

Stampa il primo object per nome indice dalla lista:

 lst[[files[1]]] 

Assicurati di usare il comando dir Rs per produrre l’elenco dei nomi di file invece di inserirli manualmente.

 filenames = dir(pattern="*01.csv") for( i in 1:length(filenames) ) { ...