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の行。名前)があります。これが機能しない理由と、それを修正する方法について何か提案があれば、私に知らせてください。
短くて速いソリューション
library(dplyr)
library(readr)
df <- list.files(full.names = TRUE) %>%
lapply(read_csv) %>%
bind_rows
あなたのコードは私のために働きました、しかしあなたは変更が必要ですheader = True
〜header = TRUE
。
すべての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
私が今までで最高のものをあげましょう。
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)
コンピューターのコア数が多い限り、この方が高速です。ビッグデータを扱う場合は、この方法をお勧めします。
私のセットアップで機能することが証明されている別のオプション:
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=';')}))
}
同じ関数を使用してみましたが、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")
お役に立てれば。乾杯!