问题描述
MCD18A1.A2001001.h15v05.061.2020097222704.hdf
MCD18A1.A2001001.h16v05.061.2020097221515.hdf
MCD18A1.A2001002.h15v05.061.2020079205554.hdf
MCD18A1.A2001002.h16v05.061.2020079205717.hdf
我想在列表中按名称(日期:A2001001 和 A2001002)对它们进行分组,如下所示:
[[MCD18A1.A2001001.h15v05.061.2020097222704.hdf,MCD18A1.A2001001.h16v05.061.2020097221515.hdf],[MCD18A1.A2001002.h15v05.061.2020079205554.hdf,MCD18A1.A2001002.h16v05.061.2020079205717.hdf]]
我使用 Python 完成此操作,但我不知道如何使用 R:
# Seperate files by date
MOdis_files_bydate = [list(i) for _,i in itertools.groupby(MOdis_files,lambda x: x.split('.')[1])]
解决方法
这是您要找的吗?
g <- sub("^[^\\.]*\\.([^\\.]+)\\..*$","\\1",s)
split(s,g)
#$A2001001
#[1] "MCD18A1.A2001001.h15v05.061.2020097222704.hdf"
#[2] "MCD18A1.A2001001.h16v05.061.2020097221515.hdf"
#
#$A2001002
#[1] "MCD18A1.A2001002.h15v05.061.2020079205554.hdf"
#[2] "MCD18A1.A2001002.h16v05.061.2020079205717.hdf"
正则表达式解释
正则表达式分为三个部分。
-
^[^\\.]*\\.
-
^
第一个抑扬符标记字符串的开始; -
^[^\\.]
开头,一个类否定一个点(第二个^
)。点是元字符,因此必须转义,\\.
; - 开头没有点的序列重复了零次或多次 (
*
); - 上一个序列以点
\\.
结尾。
-
-
([^\\.]+)
是一个捕获组。-
[^\\.]
没有点的类,如上; -
[^\\.]+
至少重复了一次 (+
)。
-
-
\\..*$"
-
\\.
以一个点开头 -
\\..*$
任何字符重复零次或多次直到结束 ($
)。
-
sub
替换的是捕获组,括号之间的内容本身就是 \\1
。这会丢弃其他所有内容。
数据
s <- "
MCD18A1.A2001001.h15v05.061.2020097222704.hdf
MCD18A1.A2001001.h16v05.061.2020097221515.hdf
MCD18A1.A2001002.h15v05.061.2020079205554.hdf
MCD18A1.A2001002.h16v05.061.2020079205717.hdf"
s <- scan(text = s,what = character())
,
您希望如何组织结果?
这是一个解决方案:
files <- c("MCD18A1.A2001001.h15v05.061.2020097222704.hdf","MCD18A1.A2001001.h16v05.061.2020097221515.hdf","MCD18A1.A2001002.h15v05.061.2020079205554.hdf","MCD18A1.A2001002.h16v05.061.2020079205717.hdf")
unique_date <- unique(sub("^[^\\.]*\\.([^\\.]+)\\..*$",files))
# (credit to Rui Barradas for the nice regular expression)
grouped_files <- lapply(unique_date,function(x){files[grepl(x,files)]})
names(grouped_files) <- unique_date
> grouped_files
# $A2001001
# [1] "MCD18A1.A2001001.h15v05.061.2020097222704.hdf" "MCD18A1.A2001001.h16v05.061.2020097221515.hdf"
# $A2001002
# [1] "MCD18A1.A2001002.h15v05.061.2020079205554.hdf" "MCD18A1.A2001002.h16v05.061.2020079205717.hdf"