首页 > 解决方案 > 如何使我的函数导入并连接/合并文件夹中的“所有”文件?

问题描述

由于....限制,我被迫一次将我的数据手动下载到一个 csv 文件中。直到现在,这还不是问题。我已将所有文件保存在同一个文件夹中,因此我可以使用一个函数,只需将它们合并(所有列名完全相同)。

但是,我最近必须下载比以前更多的数据。我目前正在尝试同时导入/连接 513 个 csv 文件,看来我的功能已达到某种限制。不再导入所有 csv 文件,这当然是非常令人不安的。

我试图将未导入的文件(连同成功导入的文件)移动到另一个文件夹,我可以很好地导入/连接这些文件。这似乎与文件本身没有任何关系,而是与同时导入/连接的数量庞大。

有没有办法无限制地导入和连接文件夹中的“所有”文件?

每个 csv 文件的前 4 行和后 4 行包含元数据,需要忽略。到目前为止,我一直在使用以下循环来导入/连接我的文件:

setwd("path")
file_list<-list.files("path")
for (file in file_list){

  # if the merged dataset doesn't exist, create it
  if (!exists("dataset")){
    dataset <- head(read_delim(file, delim=';',na="",skip=4),-4)
  }

  # if the merged dataset does exist, append to it
  if (exists("dataset")){
    temp_dataset <-head(read_delim(file, delim=';',na="",skip=4),-4)
    dataset<-rbind(dataset, temp_dataset)
    rm(temp_dataset)
  }

}

标签: rimportmergeconcatenation

解决方案


在基础R中,您将使用do.call(rbind, list_data). 使用data.table,您可以使用data.table::rbindlist它会更有效率。

data.table

library(data.table)
setwd("path")
file_list<-list.files("path")
list_data <- lapply(file_list, function(file) head(fread(file, delim=';',na="",skip=4),-4))
df <- rbindlist(list_data, fill = TRUE, use.names = TRUE)

fill = TRUE为了安全起见,我添加了参数use.names = TRUE:您在这里失去了一点效率,但您确定您在应该在的位置 rbind 列。

碱基R

setwd("path")
file_list<-list.files("path")
list_data <- lapply(file_list, function(file) head(read_delim(file, sep=';',na.strings = "", skip=4),-4))
df <- do.call(rbind, list_data)

推荐阅读