web-dev-qa-db-fra.com

Lire plusieurs fichiers CSV dans des trames de données séparées

Supposons que nous ayons des fichiers fichier1.csv , fichier2.csv , ... et fichier100.csv dans le répertoire C:\R\Data et que nous souhaitons les lire. le tout dans des trames de données séparées (par exemple, fichier1 , fichier2 , ... et fichier100 ). 

La raison en est que, même s'ils ont des noms similaires, ils ont des structures de fichiers différentes, il n'est donc pas très utile de les avoir dans une liste.

Je pourrais utiliser lapply mais cela retourne une seule liste contenant 100 images. Au lieu de cela, je veux ces trames de données dans l'environnement global.

Comment lire plusieurs fichiers directement dans l'environnement global? Ou, alternativement, comment décompresser le contenu d'une liste de trames de données? 

28
Fred

Brouillon rapide, non testé:

  1. Utilisez list.files() aka dir() pour générer dynamiquement votre liste de fichiers. 

  2. Cela retourne un vecteur, il suffit de courir le long du vecteur dans une boucle for.

  3. Lisez le i-ème fichier, puis utilisez assign() pour placer le contenu dans une nouvelle variable file_i

Cela devrait faire l'affaire pour vous.

24
Dirk Eddelbuettel

Merci à tous d'avoir répondu. 

Par souci d'exhaustivité, voici ma réponse finale pour charger un nombre quelconque de fichiers délimités par des tabulations, dans ce cas avec 6 colonnes de données, chacune contenant 1 colonne de caractères, 2 le facteur et le reste numérique:

##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"))
}
24
Fred

Utilisez assign avec une variable de caractère contenant le nom souhaité de votre bloc de données.

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
14
Hong Ooi

Ne pas Gardez-les comme une liste. C'est le chemin à parcourir.

12
hadley

Cette réponse se veut un complément plus utile à la réponse de Hadley.

Alors que le PO souhaitait spécifiquement que chaque fichier soit lu dans son espace de travail R comme un objet séparé, de nombreuses autres personnes se posant naïvement sur cette question peuvent penser que c'est ce qu'elles veulent faire, alors qu'elles il est préférable de lire les fichiers dans une seule liste de trames de données.

Alors pour mémoire, voici comment vous pourriez le faire.

#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)

Désormais, tous les fichiers peuvent être référencés par my_files[["filename"]], ce qui n’est vraiment pas beaucoup pire que de simplement avoir des variables filename distinctes dans votre espace de travail, et cela est souvent beaucoup plus pratique.

7
joran

Voici un moyen de décompresser une liste de data.frames en utilisant simplement 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
Robert

Un moyen simple d'accéder aux éléments d'une liste à partir de l'environnement global consiste à attach la liste. Notez que cela crée en fait un nouvel environnement dans le chemin de recherche et y copie les éléments de votre liste. Vous pouvez donc supprimer la liste d'origine après l'avoir jointe pour éviter que deux copies potentiellement différentes ne flottent.

2
Aaron

Lire tous les fichiers CSV d'un dossier et créer des vacteurs identiques aux noms de fichiers:

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
Manoj Kumar