Estoy usando R para visualizar algunos datos, todos en formato .txt. Hay unos pocos cientos de archivos en un directorio y quiero cargarlo todo en una sola tabla, en una sola toma.
¿Alguna ayuda?
EDITAR:
Listar los archivos no es un problema. Pero estoy teniendo problemas para pasar de la lista al contenido. He intentado algunos de los códigos desde aquí , pero obtengo un error con esta parte:
all.the.data <- lapply( all.the.files, txt , header=TRUE)
diciendo
Error in match.fun(FUN) : object 'txt' not found
Cualquier fragmento de código que aclare este problema sería muy apreciado.
Puedes intentar esto:
filelist = list.files(pattern = ".*.txt") #assuming tab separated values with a header datalist = lapply(filelist, function(x)read.table(x, header=T)) #assuming the same header/columns for all files datafr = do.call("rbind", datalist)
Mira la ayuda para las funciones dir()
aka list.files()
. Esto le permite obtener una lista de archivos, posiblemente filtrados por expresiones regulares, sobre los cuales puede hacer un bucle.
Si quieres todos a la vez, primero debes tener contenido en un archivo. Una opción sería usar cat
para escribir todos los archivos en stdout
y leerlos con popen()
. Ver help(Connections)
para más.
¡Gracias por todas las respuestas!
Mientras tanto, también pirateé un método por mi cuenta. Avíseme si es útil:
library(foreign) setwd("/path/to/directory") files <-list.files() data <- 0 for (f in files) { tempData = scan( f, what="character") data <- c(data,tempData) }
Hay dos formas rápidas de leer múltiples archivos y ponerlos en un solo dataframe o data.table
Usando fread
desde el paquete data.table
# List all txt files including sub-folders list_of_files <- list.files(path = ".", recursive = TRUE, pattern = "\\.txt$", full.names = TRUE) library(data.table) # Read all the files and create a FileName column to store filenames DT <- rbindlist( sapply(list_of_files, fread, simplify = FALSE), use.names = TRUE, idcol = "FileName" )
Usando purrr::map_df
y readr::read_table2
del paquete tidyverse
:
library(tidyverse) # Read all the files and create a FileName column to store filenames df <- list_of_files %>% set_names(.) %>% map_df(read_table2, .id = "FileName")
Nota: para limpiar los nombres de los archivos, use las funciones basename
o gsub
Hay una manera muy, muy fácil de hacer esto ahora: el paquete readtext .
readtext::readtext("path_to/your_files/*.txt")
Realmente es así de fácil.