如何根据名称对列表中的文件进行分组?

Jus*_*m3r 0 filenames split group-by r python-itertools

我有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
Run Code Online (Sandbox Code Playgroud)

我想在列表中按名称(日期: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]]
Run Code Online (Sandbox Code Playgroud)

我使用 Python 完成了此操作,但我不知道如何使用 R:

# Seperate files by date
MODIS_files_bydate = [list(i) for _, i in itertools.groupby(MODIS_files, lambda x: x.split('.')[1])]
Run Code Online (Sandbox Code Playgroud)

Rui*_*das 5

这是你想要的?

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"
Run Code Online (Sandbox Code Playgroud)

正则表达式解释

正则表达式分为三个部分。

  1. ^[^\\.]*\\.
    • ^ 第一个抑扬符标记字符串的开始;
    • ^[^\\.]一开始,一个类否定一个点(第二个^)。点是元字符,因此必须转义,\\.;
    • 开头没有点的序列重复了零次或多次 ( *);
    • 前一个序列以点结束,\\.
  2. ([^\\.]+) 是一个捕获组。
    • [^\\.] 没有点的类,如上;
    • [^\\.]+至少重复一次(+)。
  3. \\..*$"
    • \\. 从一个点开始
    • \\..*$任何字符重复零次或多次,直到结束 ( $)。

什么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())
Run Code Online (Sandbox Code Playgroud)