如何根据名称对列表中的文件进行分组?
How to group files in a list based on name?
我有 4 个文件:
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"
正则表达式解释
正则表达式分为三个部分。
^[^\.]*\.
^
第一个抑扬符标记字符串的开始;
^[^\.]
开头,一个class否定一个点(第二个^
)。点是一个元字符,因此必须转义,\.
;
- 开头没有点的序列重复零次或多次(
*
);
- 前面的序列以点结尾,
\.
。
([^\.]+)
是一个捕获组。
[^\.]
没有点的 class,如上;
[^\.]+
至少重复一次 (+
)。
\..*$"
\.
以一点开头
\..*$
任何字符重复零次或多次直到结束 ($
)。
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("^[^\.]*\.([^\.]+)\..*$", "\1", 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"
我有 4 个文件:
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"
正则表达式解释
正则表达式分为三个部分。
^[^\.]*\.
^
第一个抑扬符标记字符串的开始;^[^\.]
开头,一个class否定一个点(第二个^
)。点是一个元字符,因此必须转义,\.
;- 开头没有点的序列重复零次或多次(
*
); - 前面的序列以点结尾,
\.
。
([^\.]+)
是一个捕获组。[^\.]
没有点的 class,如上;[^\.]+
至少重复一次 (+
)。
\..*$"
\.
以一点开头\..*$
任何字符重复零次或多次直到结束 ($
)。
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("^[^\.]*\.([^\.]+)\..*$", "\1", 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"