txt - Leer múltiples archivos CSV en marcos de datos separados
extensión csv (9)
Supongamos que tenemos los archivos file1.csv , file2.csv , ... y file100.csv en el directorio C: / R / Data y queremos leerlos en marcos de datos separados (por ejemplo, archivo1 , archivo2 , ... y archivo100 ).
La razón de esto es que, a pesar de tener nombres similares, tienen diferentes estructuras de archivos, por lo que no es tan útil tenerlos en una lista.
Podría usar lapply
pero eso devuelve una sola lista que contiene 100 marcos de datos. En cambio, quiero estos marcos de datos en el entorno global.
¿Cómo leo múltiples archivos directamente en el entorno global? O, como alternativa, ¿cómo puedo descomprimir el contenido de una lista de marcos de datos en él?
Aquí hay una forma de descomprimir una lista de data.frames utilizando solo lapply
filenames <- list.files(path="../Data/original_data",
pattern="xyz+.*csv")
filelist <- lappy(filenames, read.csv)
#if necessary, assign names to data.frames
names(filelist) <- c("one","two","three")
#note the invisible function keeps lapply from spitting out the data.frames to the console
invisible(lapply(names(filelist), function(x) assign(x,filelist[[x]],envir=.GlobalEnv)))
Borrador rápido, no probado:
Use
list.files()
akadir()
para generar dinámicamente su lista de archivos.Esto devuelve un vector, simplemente corre a lo largo del vector en un ciclo
for
.Lea el archivo i-th, luego use
assign()
para colocar el contenido en una nueva variable file_i
Eso debería hacer el truco para ti.
Esta respuesta pretende ser un complemento más útil a la respuesta de Hadley.
Si bien el OP específicamente quería que cada archivo se leyera en su espacio de trabajo R como un objeto separado, muchas otras personas que aterrizan ingenuamente en esta pregunta pueden pensar que eso es lo que quieren hacer, cuando en realidad sería mejor leer los archivos en un solo archivo. lista de marcos de datos.
Entonces, para que conste, así es como puedes hacer eso.
#If the path is different than your working directory
# you''ll need to set full.names = TRUE to get the full
# paths.
my_files <- list.files("path/to/files")
#Further arguments to read.csv can be passed in ...
all_csv <- lapply(my_files,read.csv,...)
#Set the name of each list element to its
# respective file name. Note full.names = FALSE to
# get only the file names, not the full path.
names(all_csv) <- gsub(".csv","",
list.files("path/to/files",full.names = FALSE),
fixed = TRUE)
Ahora cualquiera de los archivos puede ser referido por my_files[["filename"]]
, que realmente no es mucho peor que tener variables de filename
separadas en su área de trabajo, y con frecuencia es mucho más conveniente.
Gracias a todos por responder.
Para completar esto, aquí está mi respuesta final para cargar cualquier número de archivos delimitados por tabuladores, en este caso con 6 columnas de datos, cada una de las cuales la columna 1 es caracteres, 2 es factor y el resto numérico:
##Read files named xyz1111.csv, xyz2222.csv, etc.
filenames <- list.files(path="../Data/original_data",
pattern="xyz+.*csv")
##Create list of data frame names without the ".csv" part
names <-substr(filenames,1,7))
###Load all files
for(i in names){
filepath <- file.path("../Data/original_data/",paste(i,".csv",sep=""))
assign(i, read.delim(filepath,
colClasses=c("character","factor",rep("numeric",4)),
sep = "/t"))
}
Leer todos los archivos CSV de una carpeta y crear los mismos nombres que los nombres de archivo:
setwd("your path to folder where CSVs are")
filenames <- gsub("//.csv$","", list.files(pattern="//.csv$"))
for(i in filenames){
assign(i, read.csv(paste(i, ".csv", sep="")))
}
No lo hagas Guárdelos como una lista. Es el camino a seguir.
Una forma simple de acceder a los elementos de una lista del entorno global es attach
la lista. Tenga en cuenta que esto realmente crea un nuevo entorno en la ruta de búsqueda y copia los elementos de su lista en él, por lo que es posible que desee eliminar la lista original después de adjuntarla para evitar que floten dos copias potencialmente diferentes.
Use assign
con una variable de caracteres que contenga el nombre deseado de su marco de datos.
for(i in 1:100)
{
oname = paste("file", i, sep="")
assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
#copy all the files you want to read in R in your working directory
a <- dir()
#using lapply to remove the".csv" from the filename
for(i in a){
list1 <- lapply(a, function(x) gsub(".csv","",x))
}
#Final step
for(i in list1){
filepath <- file.path("../Data/original_data/..",paste(i,".csv",sep=""))
assign(i, read.csv(filepath))
}