尝试合并R中的多个csv文件

时间:2015-05-14 16:10:08

标签: r csv import

我正在尝试使用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)。 如果您对为什么不起作用以及我如何解决它有任何建议,请告诉我。

8 个答案:

答案 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 文件:

  1. 为 R 编程设置文件位置。
  2. 运行:
    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