2016-11-19 122 views
0

我在R中有字符串向量!其中存储文件名称。基于部分字符串(日期)在字符串中排序向量R

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

“EXT-SM_ OPER _MIR_CLF31A_ T000000_20150506T235959_300_002_7_1.DBL.nc” “EXT-SM_ RE04 _MIR_CLF31A_ 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

你将不得不提取,然后可以用于排序的原始矢量的时间之后发生8号([0-9]{8})的。 –

+0

在Python我会做,因为 '进口重新 日期= re.findall('(\ d {8}) '文件名) 日期[0]' 不知道该怎么做R中! (我尝试过grep),但是无论如何 - 如果我提取了日期向量,接下来应该怎么做? – matandked

回答

2

这应该工作:

files[order(as.Date(regmatches(files,regexpr("(?<=_)[0-9]{8}",files,perl=T)),format="%Y%m%d"))] 

编辑:相同的方法,每一个人。提取日期,将它们转换为日期格式,然后使用它们重新订购files
正则表达式背后的想法是提取了一系列的一个_符号((?<=_)

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" 
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)。