106 votes

Ouverture de tous les fichiers d’un dossier et application d’une fonction

Je suis en train de faire est relativement simple morceau de l'analyse que j'ai mis dans une fonction, sur tous les fichiers dans un dossier particulier. Je me demandais si quelqu'un a des conseils pour m'aider à automatiser le processus sur un certain nombre de différents dossiers.

  1. Tout d'abord, je me demandais si il y avait un moyen de lire tous les fichiers dans un dossier particulier directement dans R. je crois que la commande suivante répertorie tous les fichiers:

files <- (Sys.glob("*.csv"))

...que j'ai trouvé de l'Aide R à la liste de tous les fichiers avec une extension spécifiée

Et puis le code suivant lit tous les fichiers dans R.

listOfFiles <- lapply(files, function(x) read.table(x, header = FALSE)) 

...de la Manipulation de plusieurs fichiers dans la R

Mais les fichiers semblent être lu en une seule liste et non à des fichiers individuels... comment puis-je modifier le script pour ouvrir tous les fichiers csv dans un dossier particulier, individuel dataframes?

  1. Deuxièmement, en supposant que je peux lire tous les fichiers séparément, comment dois-je remplir une fonction sur tous ces dataframes en une seule fois. Pour exemple, j'ai créé quatre petits dataframes afin que je puisse illustrer ce que je veux:

    Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)))
    Df.2 <- data.frame(A = c(1:6),B = (c(2,3,4,5,1,1)))
    Df.3 <- data.frame(A = c(4,6,8,0,1,11),B = (c(7,6,5,9,1,15)))
    Df.4 <- data.frame(A = c(4,2,6,8,1,0),B = (c(3,1,9,11,2,16)))
    

J'ai aussi fait un exemple de fonction:

Summary<-function(dfile){
SumA<-sum(dfile$A)
MinA<-min(dfile$A)
MeanA<-mean(dfile$A)
MedianA<-median(dfile$A)
MaxA<-max(dfile$A)

sumB<-sum(dfile$B)
MinB<-min(dfile$B)
MeanB<-mean(dfile$B)
MedianB<-median(dfile$B)
MaxB<-max(dfile$B)

Sum<-c(sumA,sumB)
Min<-c(MinA,MinB)
Mean<-c(MeanA,MeanB)
Median<-c(MedianA,MedianB)
Max<-c(MaxA,MaxB)
rm(sumA,sumB,MinA,MinB,MeanA,MeanB,MedianA,MedianB,MaxA,MaxB)

Label<-c("A","B")
dfile_summary<-data.frame(Label,Sum,Min,Mean,Median,Max)
return(dfile_summary)}

Je serais normalement utilisez la commande suivante pour appliquer la fonction de chaque individu dataframe.

Df1.résumé<-Résumé(dfile)

Est-il possible au lieu de l'application de la fonction à tous les dataframes, et d'utiliser les titres de la dataframes dans les tableaux de synthèse (c'est à dire Df1.le résumé).

Merci beaucoup,

Katie

125voto

chl Points 10205

Au contraire, je pense que travailler avec des list il est facile d'automatiser ce genre de choses.

Voici une solution (j'ai stocké vos quatre dataframes dans le dossier temp/).

filenames <- list.files("temp", pattern="*.csv", full.names=TRUE)
ldf <- lapply(filenames, read.csv)
res <- lapply(ldf, summary)
names(res) <- substr(filenames, 6, 30)

Il est important de stocker le chemin d'accès complet de vos fichiers (comme je l'ai fait avec full.names), sinon vous devez coller le répertoire de travail, par exemple

filenames <- list.files("temp", pattern="*.csv")
paste("temp", filenames, sep="/")

sera trop de travail. Notez que j'ai utilisé substr d'extraire les noms de fichiers et de rejeter les chemin d'accès complet.

Vous pouvez accéder à vos tableaux de synthèse comme suit:

> res$`df4.csv`
       A              B        
 Min.   :0.00   Min.   : 1.00  
 1st Qu.:1.25   1st Qu.: 2.25  
 Median :3.00   Median : 6.00  
 Mean   :3.50   Mean   : 7.00  
 3rd Qu.:5.50   3rd Qu.:10.50  
 Max.   :8.00   Max.   :16.00  

Si vous voulez vraiment obtenir les tableaux de synthèse, vous pouvez les extraire par la suite. E. g.,

for (i in 1:length(res))
  assign(paste(paste("df", i, sep=""), "summary", sep="."), res[[i]])

18voto

dickoa Points 7851

habituellement je n'utilise pas de boucle dans R, mais ici, c'est ma solution à l'aide de boucles et les deux paquets : plyr et dostats

plyr est sur cran et vous pouvez télécharger dostats sur https://github.com/halpo/dostats (peut-être à l'aide de install_github de Hadley devtools paquet)

En supposant que j'ai vos deux premières données.cadre (Df.1 et Df.2) dans les fichiers csv, vous pouvez faire quelque chose comme cela.

require(plyr)
require(dostats)

files <- list.files(pattern = ".csv")


for (i in seq_along(files)) {

    assign(paste("Df", i, sep = "."), read.csv(files[i]))

    assign(paste(paste("Df", i, sep = ""), "summary", sep = "."), 
           ldply(get(paste("Df", i, sep = ".")), dostats, sum, min, mean, median, max))

}

Voici la sortie

R> Df1.summary
  .id sum min   mean median max
1   A  34   4 5.6667    5.5   8
2   B  22   1 3.6667    3.0   9
R> Df2.summary
  .id sum min   mean median max
1   A  21   1 3.5000    3.5   6
2   B  16   1 2.6667    2.5   5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X