【发布时间】: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 或文本。独立考虑这两个选择。做一个快速测试,看看对于单个文件,使用fread或readRDS是否更快——这将告诉你使用哪种格式。然后确定该方法的性能是否足够快以每次都读取所有数据,或者是否最好拥有单独的文件,这样您就可以只读取需要的内容然后合并。 -
并没有太大的不同。无论如何,我发现客户端一次运行最多不超过 3 个月的文件。所以,我选择了第一种方法。谢谢!