微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?