我正在尝试使用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长度的row.names)。 如果您对为什么不起作用以及我如何解决它有任何建议,请告诉我。
答案 0 :(得分:15)
更短,更快的解决方案
library(dplyr)
library(readr)
df <- list.files(full.names = TRUE) %>%
lapply(read_csv) %>%
bind_rows
答案 1 :(得分:3)
您的代码对我有用,但您需要将header = True
更改为header = TRUE
。
答案 2 :(得分:1)
如果您的所有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
答案 3 :(得分:0)
另一个已证明可用于我的设置的选项:
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=';')}))
}
答案 4 :(得分:0)
我尝试使用相同的功能,但在合并功能中包含了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")
希望这会有所帮助。 干杯!
答案 5 :(得分:0)
让我给你我曾经有过的最好的东西
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)
只要您的计算机中有更多内核,这应该会更快。如果要处理大数据,则首选。
答案 6 :(得分:0)
要合并多个 CSV 文件:
library(plyr)
veri <- ldply(list.files(), read.csv, header=TRUE, sep='\t')
View(veri)
答案 7 :(得分:0)
对于拥有许多具有相同标头的 csvs 的人(我有大约 1000 个),这里有一个更快的方法,它避免单独解析 csvs。
col1 col2 col3
1 A pet 18
2 tree 2
3 bird 13
4 flower 14
5 B pet 17
6 tree 10
7 bird 21
8 flower 9
9 C pet 19
10 tree 21
11 bird 13
12 flower 4