studio - leer csv en r
¿Cuál es el mejor método para aplicar un script repetitivamente a n archivos.csv en R? (2)
Mi situación :
- Tengo varios archivos csv, todos con el mismo sufijo pre .csv, pero los primeros dos caracteres del nombre del archivo son diferentes (es decir, AA01.csv, AB01.csv, AC01.csv, etc.)
- Tengo un script R que me gustaría ejecutar en cada archivo. Este archivo esencialmente extrae los datos de .csv y los asigna a vectores / los convierte en objetos de timeseries. (Por ejemplo, objeto de series temporales AA01 xts, objeto AB01 xts)
Lo que me gustaría lograr :
- Incruste la secuencia de comandos dentro de un bucle más grande (o según corresponda) para ejecutar secuencialmente sobre cada archivo y aplicar la secuencia de comandos
- Elimine los objetos intermedios creados (vea el fragmento de código a continuación)
- Déjame con los objetos xts finales creados a partir de cada archivo de datos en bruto (es decir, AA01 a AC01, etc. como valores / vectores, etc.)
¿Cuál sería la forma correcta de insertar este script en R? Lo siento, ¡pero soy un novato en programación!
Mi código de secuencia de comandos a continuación ... el encabezado de cada columna en cada archivo CSV es FECHA, HORA, VALOR
# 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()
y luego repita en cada archivo .csv hasta extraer todos los objetos xts.
es decir, lo que terminaríamos dentro de R, listo para otras aplicaciones son:
aa01xtsobj, ab01xtsobj, ac01xtsobj....etc
cualquier ayuda sobre cómo hacer esto sería muy apreciada.
Asegúrese de usar el comando Rs dir
para producir la lista de nombres de archivos en lugar de ingresarlos manualmente.
filenames = dir(pattern="*01.csv")
for( i in 1:length(filenames) )
{
...
Encuentro un bucle for y las listas son lo suficientemente buenas para cosas como esta. Una vez que tiene un conjunto de código de trabajo, es bastante fácil pasar de un bucle a una función que puede ser sapply
o similar, pero ese tipo de vectorización es idiosincrásico de todos modos y probablemente no sea útil fuera de líneas privadas.
Probablemente desee evitar la asignación a múltiples objetos con diferentes nombres en el espacio de trabajo (esta es una pregunta frecuente que generalmente aparece como "cómo asigno ()...").
Por favor, ten cuidado con mi código no probado.
Un vector de nombres de archivos y una lista con un elemento con nombre para cada archivo.
files <- c("AA01.csv", "AA02.csv")
lst <- vector("list", length(files))
names(lst) <- files
Bucle sobre cada archivo.
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)
Ahora todos los objetos leídos están en primer lugar, pero querrá probar que el archivo está disponible, que se leyó correctamente, y es posible que desee modificar los nombres para que sean más sensibles que solo el nombre del archivo.
Imprima el primer objeto por índice de la lista:
lst[[files[1]]]