【问题标题】:R - Efficient way to read multiple filesR - 读取多个文件的有效方法
【发布时间】:2017-10-10 03:32:49
【问题描述】:

我在一个文件夹中有一堆 csv 文件,每个文件的文件名中都有一个日期。我正在尝试根据用户定义的开始和结束日期提取数据。我有以下代码

#Method1
f <- list.files("C:/Fileloc")
d <- data.frame()

#start and end dates are user inputs from Shiny
startdate = as.POSIXct("2015-10-01") 
enddate = as.POSIXct("2016-09-30")

for(i in 1: length(f)){
  filedate <- as.POSIXct(substr(f[i],5,14))  #File name example: XYZ_2015-10-05_ABCD.csv

  if(between(filedate,startdate, enddate)) {
    d<-rbind(d, fread(paste("C:/Fileloc",f[[i]],sep = "/"), sep = ";", header = FALSE,
                     blank.lines.skip = TRUE))
  }
}

这是读取所有文件所需的时间(本例中为 366 个文件)

user  system elapsed 
79.56   29.05  108.60  

在此站点上的快速搜索使我找到了一个解决方案,该解决方案说将所有文件组合成一个 .RDS 文件然后进行子集化会更快。我使用下面的代码来做到这一点。

#Method2
saveRDS(d, file = "Alldata.RDS") #d is the same data frame from Method1

dat <- readRDS("Alldata.RDS")
colnames(dat) <- c("Col1", "Date","Col3","Col4")

library(dplyr)
dat<-filter(dat, between(as.POSIXct(dat$Date, format = "%m/%d/%Y"),
                       as.POSIXct("2015-10-01"), as.POSIXct("2016-09-30"))) 

这就是运行这一步所需要的。

   user  system elapsed 
  58.81    0.36   59.24 

问题是,在第二种方法中,无论开始日期和结束日期如何,它都需要相同的时间,而如果日期范围内只有几天,第一种方法会更快。我认为它正在发生,因为它每次都在搜索整个数据。

我想知道是否有更有效的方法来读取/子集数据?请注意,由于我在保存到.rds 之前按顺序绑定文件,因此.rds 文件中的日期列应该已经按日期排序。我们可以在过滤时以某种方式利用它吗?

【问题讨论】:

  • 如果您关心读/写速度,请使用saveRDS(..., compress = FALSE)。您有两种选择:单独或全部保存文件,将文件另存为 RDS 或文本。独立考虑这两个选择。做一个快速测试,看看对于单个文件,使用freadreadRDS 是否更快——这将告诉你使用哪种格式。然后确定该方法的性能是否足够快以每次都读取所有数据,或者是否最好拥有单独的文件,这样您就可以只读取需要的内容然后合并。
  • 并没有太大的不同。无论如何,我发现客户端一次运行最多不超过 3 个月的文件。所以,我选择了第一种方法。谢谢!

标签: r subset


【解决方案1】:

还不能对帖子发表评论,所以我在这里回答 - 一种更快的子集方法是使用 data.table 格式:

d[Date %in% start_date:end_date, .(Col1, Date, Col3, Col4),]

此时您已经使用方法 1 保存了 d。我发现简单地通过名称而不是双引号来引用列要容易得多。

对于 method1 本身,我发现使用 apply 系列函数而不是 for 循环更快。使用一个函数解析所有文件名以获取与您的条件(开始日期、结束日期)匹配的名称向量,然后使用lapply(file_names, read_function) 读取所有数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 2017-04-27
    • 1970-01-01
    • 2021-08-02
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多