基于未知字符的部分匹配对字符串向量进行子集化

Posted

技术标签:

【中文标题】基于未知字符的部分匹配对字符串向量进行子集化【英文标题】:Subsetting a string vector based on a partial match of unknown characters 【发布时间】:2022-01-17 17:59:40 【问题描述】:

我有一个格式为 8 字符的文件名的向量

"/relative/path/to/folder/a(bc|de|fg)...[xy]1.sav"

其中括号包含两三个已知字符之一,而“...”是三个未知字符。我想匹配所有具有相同未知序列XXX的字符向量并排序到字符向量列表中。

我不确定如何继续。我正在考虑一种方法来提取第四到第六位的字母(...),然后放入一个向量中,然后使用 `grep 获取所有具有匹配字符串的文件。

例如

# Pseudo-code. Not functioning code, but sort of the thing I want to do

> char.extr <- str_extract(file.vector, !"a(bc|de|fg)...[xy]1.sav")
> char.extr

"JKL", "MNO" ,"PQR" ...

# Use grep and lapply to put matched strings into list

> path.list <- lapply(char.extr, grep, file.vector)

> path.list

  1. "/relative/path/to/folder/abcJKLx1.sav"
     "/relative/path/to/folder/adeJKLy1.sav"
  
  2. "/relative/path/to/folder/afgMNOx1.sav"
     "/relative/path/to/folder/abcMNOy1.sav"

【问题讨论】:

【参考方案1】:

由于我们知道名称结构,我想提取 3 个字母的子字符串,然后使用 split 来获取您正在寻找的单个列表。

split(path.list, substr(basename(path.list), 4, 6))

【讨论】:

basename() 结合substr() 是我一直在寻找的东西。它确实分离出了所需的 3 个字母子字符串。但是,您的代码示例基本上将所有文件路径放入一个列表元素中,该元素以第一个子字符串命名。我尝试在我的代码示例中使用lapplylapply(substr(basename(path.list), 4, 6), grep, path.list),但这会导致 R 会话挂起。 更正。在没有 [[1]] 的情况下重新运行代码:split(path.list, substr(basename(path.list), 4, 6))。这可能是因为path.list 变量因 R 会话崩溃而丢失。 很高兴听到,没有可重复的例子,它很快就放在一起了。更正答案

以上是关于基于未知字符的部分匹配对字符串向量进行子集化的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 使用 for 循环在部分字符串匹配上设置列:使用包含 NaN 的向量进行错误索引

在另一个字符串向量中查找字符串向量的匹配项

根据时间对 pandas DataFrame 进行子集化

R 子集字符串值,包括竖线(|)

在R中将字符串转换为二进制向量

Python/Pandas:通过匹配的索引标准对 Dataframe 进行子集化