studio read importar exportar desde datos commander cargar r

read - importar datos en r studio



Al importar CSV en R, ¿cómo generar una columna con el nombre del CSV? (6)

Aquí hay una solución que utiliza la función import_list() de rio , que está diseñada exactamente para este propósito.

# setup some example files to import rio::export(mtcars, "mtcars1.csv") rio::export(mtcars, "mtcars2.csv") rio::export(mtcars, "mtcars3.csv")

El comportamiento predeterminado de import_list() es obtener una lista de marcos de datos:

str(rio::import_list(dir(pattern = "mtcars")), 1) ## List of 3 ## $ :''data.frame'': 32 obs. of 11 variables: ## $ :''data.frame'': 32 obs. of 11 variables: ## $ :''data.frame'': 32 obs. of 11 variables:

Pero puede usar el argumento rbind para construir un único marco de datos (observe la columna _file al final):

str(rio::import_list(dir(pattern = "mtcars"), rbind = TRUE)) ## ''data.frame'': 96 obs. of 12 variables: ## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... ## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ... ## $ disp : num 160 160 108 258 360 ... ## $ hp : int 110 110 93 110 175 105 245 62 95 123 ... ## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... ## $ wt : num 2.62 2.88 2.32 3.21 3.44 ... ## $ qsec : num 16.5 17 18.6 19.4 17 ... ## $ vs : int 0 0 1 1 0 1 0 1 1 1 ... ## $ am : int 1 1 1 0 0 0 0 0 0 0 ... ## $ gear : int 4 4 4 3 3 3 3 4 4 4 ... ## $ carb : int 4 4 1 1 2 1 4 2 2 4 ... ## $ _file: chr "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" ...

y el argumento rbind_label para especificar el nombre de la columna que identifica cada archivo:

str(rio::import_list(dir(pattern = "mtcars"), rbind = TRUE, rbind_label = "source")) ## ''data.frame'': 96 obs. of 12 variables: ## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... ## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ... ## $ disp : num 160 160 108 258 360 ... ## $ hp : int 110 110 93 110 175 105 245 62 95 123 ... ## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... ## $ wt : num 2.62 2.88 2.32 3.21 3.44 ... ## $ qsec : num 16.5 17 18.6 19.4 17 ... ## $ vs : int 0 0 1 1 0 1 0 1 1 1 ... ## $ am : int 1 1 1 0 0 0 0 0 0 0 ... ## $ gear : int 4 4 4 3 3 3 3 4 4 4 ... ## $ carb : int 4 4 1 1 2 1 4 2 2 4 ... ## $ source: chr "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" ...

Para la divulgación completa: soy el mantenedor de rio.

Tengo un gran número de archivos csv que quiero leer en R. Todos los encabezados de las columnas en los csvs son iguales. Al principio pensé que tendría que crear un bucle basado en la lista de nombres de archivos, pero después de buscar encontré una manera más rápida. Esto lee y combina todos los csvs correctamente (que yo sepa).

filenames <- list.files(path = ".", pattern = NULL, all.files = FALSE, full.names = FALSE, recursive = FALSE, ignore.case = FALSE) library(plyr) import.list <- llply(filenames, read.csv) combined <- do.call("rbind", import.list)

El único problema es que quiero saber de qué csv proviene una fila específica de datos. Quiero una columna etiquetada como ''fuente'' que contenga el nombre del csv del que proviene la fila en particular. así, por ejemplo, si el csv se llamaba Chicago_IL.csv cuando los datos llegaron a R, la fila se vería así:

> City State Market etc Source > Burbank IL Western etc Chicago_IL


Encontré este trabajo para mí, que crea una nueva columna y combina archivos csv de carpetas completas.

Usando setNames ():

file.list <- list.files(pattern = ''*.csv'') file.list <- setNames(file.list, file.list) df.list <- lapply(file.list, read_csv) df.list <- Map(function(df, name) { df$issue <- name df }, df.list, names(df.list)) df <- rbindlist(df.list,use.names = TRUE, fill = TRUE, idcol = "Issue")

Éste crea una nueva columna del archivo fuente, y los combina.


Prueba esto:

do.call("rbind", sapply(filenames, read.csv, simplify = FALSE))

Los nombres de las filas indicarán la fuente y el número de línea.


Un poco desordenado pero funciona:

filenames <- c("foo.csv","bar.csv") import.list <- list(matrix(,4,4),matrix(6,6)) source <- unlist(sapply(1:length(filenames),function(i)rep(gsub(".csv","",filenames[i]),nrow(import.list[[i]])))) source [1] "foo" "foo" "foo" "foo" "bar" "bar" "bar" "bar" "bar" "bar" combined$source <- source


Ya has hecho todo el trabajo duro. Con una modificación bastante pequeña esto debería ser sencillo.

La lógica es:

  1. Cree una pequeña función auxiliar que lea un csv individual y agregue una columna con el nombre del archivo.
  2. Llame a esta función de ayuda en llply ()

Lo siguiente debería funcionar:

read_csv_filename <- function(filename){ ret <- read.csv(filename) ret$Source <- filename #EDIT ret } import.list <- ldply(filenames, read_csv_filename)

Tenga en cuenta que le he propuesto otra pequeña mejora a su código: read.csv () devuelve un data.frame; esto significa que puede usar ldply () en lugar de llply ().


solución data.table

Actualización: aquí hay una solución completa de data.table para esto, usando keep.rownames. Suponiendo que todos sus CSV están en una carpeta:

library(data.table) my.path <- "C:/some/path/to/your/folder" #set the path filenames <- paste(my.path, list.files(path=my.path), sep="/") #list of files #this will create a rn column with the path in it my.dt<- data.table(do.call("rbind", sapply(filenames, read.csv, sep=";")), keep.rownames = T)

Solución básica de sintaxis.

Usé la solución de Grothendieck y agregué una línea para crear una columna a partir de los nombres de las filas. Tan sencillo como eso:

something <- do.call("rbind", sapply(filenames, read.csv, sep=";", simplify = FALSE)) something$mycolumn <- row.names(something)

Si solo quieres una parte del nombre de archivo, reemplaza la segunda línea por algo como esto:

something$mycolumn <- substring(row.names(something),1,3)

Esto usará los primeros 3 caracteres del nombre de archivo como el valor en la nueva columna.