我在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")
答案 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}
)
_
)