web-dev-qa-db-ja.com

Rで複数のcsvファイルをマージしようとしています

Rを使用して複数のcsvファイルをマージしようとしています。すべてのCSVファイルに同じフィールドがあり、すべてこれらのCSVファイルのみを含む共有フォルダーです。私は次のコードを使用してそれをやろうとしました:

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

「Y:/ R Practice/specdata」のようなパスを入力しています。関数を300個程度のcsvファイルに適用すると出力が得られますが、結果として列名が得られますが、その下には<0行>(または長さ0の行。名前)があります。これが機能しない理由と、それを修正する方法について何か提案があれば、私に知らせてください。

9
Cole

短くて速いソリューション

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

あなたのコードは私のために働きました、しかしあなたは変更が必要ですheader = Trueheader = TRUE

3

すべてのcsvファイルにまったく同じフィールド(列名)があり、それらを垂直に結合したい場合は、rbindの代わりに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

私が今までで最高のものをあげましょう。

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)

コンピューターのコア数が多い限り、この方が高速です。ビッグデータを扱う場合は、この方法をお勧めします。

0
Hope

私のセットアップで機能することが証明されている別のオプション:

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


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

ロードプロセス中にCSVファイルをより詳細に制御する必要がある場合は、次のような関数でfreadを変更できます。

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

同じ関数を使用してみましたが、all=TRUEをマージ関数で使用すると、問題なく動作しました。

私が使用したコードは次のとおりです。

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

お役に立てれば。乾杯!

0