Leer varios archivos CSV en marcos de datos separados


Supongamos que tenemos archivos file1.csv, file2.csv ,... , y file100.csv en el directorio C:\R\Data y queremos leerlos todos en marcos de datos separados (por ejemplo, file1, file2 ,... , y file100 ).

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 su lugar, quiero estos marcos de datos en el Entorno Global.

¿Cómo puedo leer varios archivos directamente en el entorno global? O, alternativamente, ¿cómo descomprimo el contenido de una lista de marcos de datos en ella?

Author: Joshua Ulrich, 2011-03-16

9 answers

Borrador rápido, no probado:

  1. Utilice list.files() aka dir() para generar dinámicamente su lista de archivos.

  2. Esto devuelve un vector, simplemente corre a lo largo del vector en un bucle for.

  3. Lea el archivo i-ésimo, luego use assign() para colocar el contenido en una nueva variable file_i

Eso debería hacer el truco para usted.

 23
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 01:00:41

Gracias a todos por responder.

Para completar aquí está mi respuesta final para cargar cualquier número de archivos delimitados (tab), en este caso con 6 columnas de datos cada una donde 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"))
}
 21
Author: Fred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 20:13:55

Use assign con una variable de carácter 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="")))
}
 14
Author: Hong Ooi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 01:02:56

No lo hagas. Guárdalos como una lista. Es el camino a seguir.

 12
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 03:13:40

Aquí hay una manera de desempaquetar una lista de datos.marcos usando just 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)))
 6
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-05 20:55:07

Esta respuesta pretende ser un complemento más útil a la respuesta de Hadley.

Mientras que el OP quería específicamente que cada archivo se leyera en su espacio de trabajo R como un objeto separado, muchas otras personas que ingenuamente aterrizan en esta pregunta pueden pensar que eso es lo que quieren hacer, cuando de hecho estarían mejor leyendo los archivos en una sola lista de marcos de datos.

Así que 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 solo tener variables filename separadas en su espacio de trabajo, y a menudo es mucho más conveniente.

 6
Author: joran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-27 07:33:33

Una forma sencilla de acceder a los elementos de una lista desde el entorno global es attach la lista. Tenga en cuenta que esto en realidad crea un nuevo entorno en la ruta de búsqueda y copia los elementos de su lista en ella, por lo que es posible que desee eliminar la lista original después de adjuntar para evitar tener dos copias potencialmente diferentes flotando alrededor.

 2
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 14:31:56

Leer todos los archivos CSV de una carpeta y crear vactors iguales 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="")))
}
 0
Author: Manoj Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 06:59:51
#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))
}
 -2
Author: Parikshit Sohoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-25 07:06:20