web-dev-qa-db-fra.com

Comment lisez-vous plusieurs fichiers .txt dans R?

J'utilise R pour visualiser certaines données qui sont toutes au format .txt. Il y a quelques centaines de fichiers dans un répertoire et je veux tout charger dans une table, en une seule fois.

De l'aide?

ÉDITER:

Lister les fichiers n'est pas un problème. Mais j'ai du mal à passer de la liste au contenu. J'ai essayé une partie du code de ici , mais je reçois un bug avec cette partie:

all.the.data <- lapply( all.the.files,  txt  , header=TRUE)

en disant

 Error in match.fun(FUN) : object 'txt' not found

Tout extrait de code qui clarifierait ce problème serait grandement apprécié.

26
Eric Brotto

Merci pour toutes les réponses!

En attendant, j'ai également piraté une méthode par moi-même. Faites-moi savoir si cela est utile:

library(foreign)

setwd("/path/to/directory")

files <-list.files()

data <- 0


for (f in files) {

tempData = scan( f, what="character")

data <- c(data,tempData)    

} 
4
Eric Brotto

Vous pouvez essayer ceci:

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) 
30
Greg

Il existe deux façons rapides de lire plusieurs fichiers et de les placer dans une seule trame de données ou data.table

Obtenez d'abord la liste de tous les fichiers txt (y compris ceux des sous-dossiers)

list_of_files <- list.files(path = ".", recursive = TRUE,
                            pattern = "\\.txt$", 
                            full.names = TRUE)

1) Utilisez fread() w/ rbindlist() à partir de data.table package

#install.packages("data.table", repos = "https://cran.rstudio.com")
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")

2) Utilisez readr::read_table2() w/ purrr::map_df() à partir de tidyverse framework:

#install.packages("tidyverse", 
#                 dependencies = TRUE, repos = "https://cran.rstudio.com")
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")

Remarque: pour nettoyer les noms de fichiers, utilisez les fonctions basename ou gsub


Modifier 1 : pour lire plusieurs fichiers csv et ignorer les header en utilisant readr::read_csv

list_of_files <- list.files(path = ".", recursive = TRUE,
                            pattern = "\\.csv$", 
                            full.names = TRUE)

df <- list_of_files %>%
  purrr::set_names(nm = (basename(.) %>% tools::file_path_sans_ext())) %>%
  purrr::map_df(read_csv, 
                col_names = FALSE,
                skip = 1,
                .id = "FileName")

Édition 2 : pour convertir un modèle comprenant un caractère générique en l'expression régulière équivalente, utilisez glob2rx()

11
Tung

Regardez l'aide pour les fonctions dir() alias list.files(). Cela vous permet d'obtenir une liste de fichiers, éventuellement filtrés par des expressions régulières, sur lesquels vous pouvez boucler.

Si vous les souhaitez tous en même temps, vous devez d'abord avoir le contenu dans un seul fichier. Une option consisterait à utiliser cat pour taper tous les fichiers dans stdout et à lire cela à l'aide de popen(). Voir help(Connections) pour en savoir plus.

5
Dirk Eddelbuettel

Il existe maintenant un moyen vraiment très simple de le faire: le paquet readtext.

readtext::readtext("path_to/your_files/*.txt")

C'est vraiment aussi simple que cela.

3
Ken Benoit