web-dev-qa-db-fra.com

Essayer de fusionner plusieurs fichiers csv dans R

J'essaie de fusionner plusieurs fichiers csv en utilisant R. tous les fichiers CSV ont les mêmes champs et sont tous un dossier partagé contenant uniquement ces fichiers CSV. J'ai essayé de le faire en utilisant le code suivant:

multmerge=function(mypath) {
    filenames=list.files(path=mypath, full.names=TRUE)
    datalist= lapply(filenames, function (x) read.csv(file=x, header=True))
    Reduce(function(x,y) merge(x,y), datalist)}

J'entre dans mon chemin comme quelque chose comme "Y:/R Practice/specdata". J'obtiens une sortie lorsque j'applique la fonction à mes quelque 300 fichiers csv, mais le résultat me donne les noms de mes colonnes, mais en dessous il y a <0 lignes> (ou 0-length row.names). Veuillez me faire savoir si vous avez des suggestions sur les raisons pour lesquelles cela ne fonctionne pas et comment je peux y remédier.

9
Cole

Pour une solution plus courte et plus rapide

library(dplyr)
library(readr)
df <- list.files(full.names = TRUE) %>% 
  lapply(read_csv) %>% 
  bind_rows 
22
Maiasaura

Votre code a fonctionné pour moi, mais vous devez modifier header = True à header = TRUE.

3

Si tous vos fichiers csv ont exactement les mêmes champs (noms de colonnes) et que vous souhaitez simplement les combiner verticalement, vous devez utiliser rbind au lieu de merge:

> a
             A         B
[1,]  2.471202 38.949232
[2,] 16.935362  6.343694
> b
            A          B
[1,] 0.704630  0.1132538
[2,] 4.477572 11.8869057
> rbind(a, b)
             A          B
[1,]  2.471202 38.9492316
[2,] 16.935362  6.3436939
[3,]  0.704630  0.1132538
[4,]  4.477572 11.8869057
1
wctjerry

Permettez-moi de vous donner le meilleur que j'aie jamais eu:

library(pacman)
p_load(doParallel,data.table,dplyr,stringr,fst)

# get the file name
dir() %>% str_subset("\\.csv$") -> fn

# use parallel setting
(cl = detectCores() %>% 
  makeCluster()) %>% 
  registerDoParallel()

# read and bind
system.time({
  big_df = foreach(i = fn,
                    .packages = "data.table") %dopar% {
                      fread(i,colClasses = "chracter")
                    } %>% 
    rbindlist(fill = T)
})

# end of parallel work
stopImplicitCluster(cl)

Cela devrait être plus rapide tant que vous avez plus de cœurs dans votre ordinateur.Si vous traitez avec des mégadonnées, c'est préférable.

0
Hope

Une autre option qui s'est avérée efficace pour ma configuration:

multmerge = function(path){
  filenames=list.files(path=path, full.names=TRUE)
  rbindlist(lapply(filenames, fread))
}


path <- "Dropbox/rstudio-share/dataset/MB"
DF <- multmerge(path)

Si vous avez besoin d'un contrôle beaucoup plus granulaire de votre fichier CSV pendant le processus de chargement, vous pouvez changer le fread par une fonction comme ceci:

multmerge = function(path){
  filenames=list.files(path=path, full.names=TRUE)
  rbindlist(lapply(filenames, function(x){read.csv(x, stringsAsFactors = F, sep=';')}))
}
0
Michael

J'ai essayé de travailler avec la même fonction mais j'ai inclus le all=TRUE dans la fonction de fusion et fonctionnait très bien.

Le code que j'ai utilisé est le suivant:

multmerge = function(mypath){
  filenames=list.files(path=mypath, full.names=TRUE)
  datalist = lapply(filenames, function(x){read.csv(file=x,header=T)})
  Reduce(function(x,y) {merge(x,y,all = TRUE)}, datalist)
}

full_data = multmerge("path_name for your csv folder")

J'espère que cela t'aides. À votre santé!

0
Mustapha Wasseja