首页 > 解决方案 > 按日期字符串过滤文件列表

问题描述

我有一个文件列表:

file_list <- c("C:\\Users\\uname\\files/DailyOpenOrders_NET_20160922.csv", 
"C:\\Users\\uname\\files/DailyOpenOrders_NET_20160923.csv", 
"C:\\Users\\uname\\files/DailyOpenOrders_NET_20160927.csv", 
"C:\\Users\\uname\\files/DailyOpenOrders_NET_20160928.csv", 
"C:\\Users\\uname\\files/DailyOpenOrders_NET_20160929.csv", 
"C:\\Users\\uname\\files/DailyOpenOrders_NET_20160930.csv"
)

以及这些文件名日期的解析列表,仅针对星期一的日期进行过滤:

file_dates_mon <- structure(list(file_dates = c("20161003", "20161010", "20161017", "20161024", "20161031", "20161107"), weekday = c("Monday", "Monday", 
"Monday", "Monday", "Monday", "Monday")), .Names = c("file_dates", 
"weekday"), row.names = c(NA, 6L), class = "data.frame")

我尝试使用str_detect(file_list,file_dates_mon$file_dates)尝试将文件列表过滤到仅限星期一的日期。目的是预先过滤文件列表,而不是合并 361 文件然后按日期过滤。

有没有办法根据日期预先过滤列表file_dates_monfile_list是结果

dir<- choose.dir()
file_list<-list.files(dir,full.names = TRUE,pattern="DailyOpenOrders_NET_*")

标签: rdplyrstringr

解决方案


这里的问题是str_detect通过模式或字符串进行矢量化。不是同时两个。

一些模式:

filter_mon <- c("20160929", "20160927")

现在检查str_detect

library(stringr)
str_detect(file_list, filter_mon)
#output
[1] FALSE FALSE FALSE FALSE  TRUE FALSE

只有第一个模式在所有字符串中都匹配。一个TRUE被退回。

解决这个问题的一种方法是str_detect为每个file_dates_mon$file_dates(或在本例中filter_mon)运行,然后Reduce是逻辑向量:

file_list[Reduce("|", lapply(filter_mon, function(x) str_detect(file_list, x)))]

#output
[1] "C:\\Users\\uname\\files/DailyOpenOrders_NET_20160927.csv" "C:\\Users\\uname\\files/DailyOpenOrders_NET_20160929.csv"

grepl也是一种选择

file_list[Reduce("|", lapply(filter_mon, function(x) grepl(x, file_list)))]

推荐阅读