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

问题描述

我有 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"

正则表达式解释

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

  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())
,

您希望如何组织结果?

这是一个解决方案:

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"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...