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é.
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)
}
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)
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()
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.
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.