正在尝试在R中合并多个csv文件

正在尝试在R中合并多个csv文件,r,csv,import,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(functio

我正在尝试使用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长度的row.names)。
请让我知道,如果你有任何建议,为什么这是不工作,我可以如何修复它

您的代码对我有效,但您需要将
header=True
更改为
header=True

以获得更短更快的解决方案

library(dplyr)
library(readr)
df <- list.files(path="yourpath", full.names = TRUE) %>% 
  lapply(read_csv) %>% 
  bind_rows 
库(dplyr)
图书馆(readr)
df%
lapply(读取)%>%
绑定行

如果您的所有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

另一个已证明适用于我的设置的选项:

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


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

我尝试使用相同的函数,但在合并函数中包含了
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")
希望这有帮助。
干杯

让我给你我所拥有的最好的:

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)

只要您的计算机中有更多的内核,这应该会更快。如果您处理的是大数据,则最好使用。

组合多个CSV文件:

  • 为R编程设置文件位置
  • 运行:
    库(plyr)
    
    veri对于任何拥有多个具有相同标题的CSV的人(我有~1000个),这里有一种更快的方法,可以避免单独解析CSV

    filenames <- list.files(path=mypath, full.names=TRUE)
    
    #read the files in as plaintext
    csv_list <- lapply(filenames , readLines)
    
    #remove the header from all but the first file
    csv_list[-1] <- sapply(csv_list[-1], "[", 2)
    
    #unlist to create a character vector
    csv_list <- unlist(csv_list)
    
    #write the csv as one single file
    writeLines(text=csv_list,
               con="all_my_csvs_combined.csv")
               )
    
    #read the csv as one single file
    all_my_csvs_combined <- read.csv("all_my_csvs_combined.csv")
    
    

    文件名输出文件时是否有任何警告?您对它们使用了正确的编码吗?没有,没有警告。一切进展顺利。只是输出只是我的列名,所以你知道我得到的输出是什么意思吗?另外,感谢您的回复。我创建了一个文件夹,其中包含了与您描述的列名相同的
    .csv
    文件,然后使用上面提到的更改运行您的代码,这样可以合并所有
    .csv
    文件。所以我不能重现你的错误@不过,Maiasaura的代码是一个更好的解决方案。谢谢你的回复。我尝试了你的解决方案。也许我没有正确地使用它,但是在将代码复制并粘贴到我的控制台之后,我想到了“有50个或更多的警告(使用warnings()查看前50个)”。所有的问题都与解析有关,如果这对您有任何意义的话。谢谢。请注意,
    df
    是R中的默认函数。可能重命名为
    d
    pasing问题可以通过更改函数参数来解决。我在dplyr代码中找不到如何实现它,所以我在dplyr块中创建了一个不同的函数:readmeta简洁版的其他东西。这可能很明显,但如果您想知道最终合并的
    csv
    在哪里,它实际上在数据帧
    df
    中。您需要使用此
    write.csv(df,“newmergedfile.csv”)
    filenames <- list.files(path=mypath, full.names=TRUE)
    
    #read the files in as plaintext
    csv_list <- lapply(filenames , readLines)
    
    #remove the header from all but the first file
    csv_list[-1] <- sapply(csv_list[-1], "[", 2)
    
    #unlist to create a character vector
    csv_list <- unlist(csv_list)
    
    #write the csv as one single file
    writeLines(text=csv_list,
               con="all_my_csvs_combined.csv")
               )
    
    #read the csv as one single file
    all_my_csvs_combined <- read.csv("all_my_csvs_combined.csv")