基于R中字符串(日期)的一部分对字符串矢量进行排序

时间:2016-11-19 13:40:53

标签: r sorting

我在R中有字符串向量!它存储文件名。

文件名包含以下列格式存储的日期:' YYYYMMDD'。 示例文件名如下:

" EXT-SM_的 OPER _MIR_CLF31A_的 20150506 T000000_20150506T235959_300_002_7_1.DBL.nc" " EXT-SM_的 RE04 _MIR_CLF31A_的 20150505 T000000_20150505T235959_300_001_7_1.DBL.nc"

我想使用文件名中的日期对列表进行排序(因此最早日期的文件将是向量中的第一个)。 不幸的是,R中的排序功能!没有任何'正则表达式'排序标准参数。我该怎么做?

我的示例数据:

files <- c("ext-SM_OPER_MIR_CLF31A_20150506T000000_20150506T235959_300_002_7_1.DBL.nc", 
"SMAP_L3_SM_AP_20150422_R13080_001.h5.tif","SMAP_L3_SM_AP_20150606_R13080_001.h5.tif",
"ext-SM_OPER_MIR_CLF31A_20150530T000000_20150530T235959_300_003_7_1.DBL.nc",
"ext-SM_RE04_MIR_CLF31A_20150418T000000_20150418T235959_300_001_7_1.DBL.nc", 
"ext-SM_RE04_MIR_CLF31A_20150419T000000_20150419T235959_300_001_7_1.DBL.nc")

3 个答案:

答案 0 :(得分:2)

您可以使用stringi提取日期和排序,即

library(stringi)
v1 <- unique(unlist(stri_extract_all_regex(files, '2015[0-9]{4}')))
ind <- order(as.POSIXct(v1, format = '%Y%m%d'))
files[ind]
#[1] "ext-SM_RE04_MIR_CLF31A_20150418T000000_20150418T235959_300_001_7_1.DBL.nc"
#[2] "ext-SM_RE04_MIR_CLF31A_20150419T000000_20150419T235959_300_001_7_1.DBL.nc"
#[3] "SMAP_L3_SM_AP_20150422_R13080_001.h5.tif"                                 
#[4] "ext-SM_OPER_MIR_CLF31A_20150506T000000_20150506T235959_300_002_7_1.DBL.nc"
#[5] "ext-SM_OPER_MIR_CLF31A_20150530T000000_20150530T235959_300_003_7_1.DBL.nc"
#[6] "SMAP_L3_SM_AP_20150606_R13080_001.h5.tif"  

答案 1 :(得分:2)

以下是您可以做的事情:

temp <- as.Date(sub('^\\S+\\_([0-9]{8})[T\\_][0A-Z]\\S+', '\\1', files), "%Y%m%d")
files[order(temp)]

# [1] "ext-SM_RE04_MIR_CLF31A_20150418T000000_20150418T235959_300_001_7_1.DBL.nc"
# [2] "ext-SM_RE04_MIR_CLF31A_20150419T000000_20150419T235959_300_001_7_1.DBL.nc"
# [3] "SMAP_L3_SM_AP_20150422_R13080_001.h5.tif"                                 
# [4] "ext-SM_OPER_MIR_CLF31A_20150506T000000_20150506T235959_300_002_7_1.DBL.nc"
# [5] "ext-SM_OPER_MIR_CLF31A_20150530T000000_20150530T235959_300_003_7_1.DBL.nc"
# [6] "SMAP_L3_SM_AP_20150606_R13080_001.h5.tif"  

第一步是从文件名中提取日期,放入变量temp,然后根据日期的顺序对向量files进行排序。

正则表达式的作品喜欢这个:

从文件名(^)的末尾开始,选择非空格字符(\\S+),然后选择下划线(\\_),然后选择日期的八个数字(([0-9]{8})),将它们放入捕获组(带括号),然后匹配以下字符(T或下划线),后跟0或字母,并返回捕获组({{1 }})。

答案 2 :(得分:2)

这应该有效:

DBTIMEZONE

编辑与所有人一样的方法。提取日期,将其转换为日期格式,然后使用它们重新排序files[order(as.Date(regmatches(files,regexpr("(?<=_)[0-9]{8}",files,perl=T)),format="%Y%m%d"))] 正则表达式背后的想法是提取在files符号([0-9]{8}

之后出现的一系列8个数字(_