基于未知字符的部分匹配对字符串向量进行子集化
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 个字母子字符串。但是,您的代码示例基本上将所有文件路径放入一个列表元素中,该元素以第一个子字符串命名。我尝试在我的代码示例中使用lapply
:lapply(substr(basename(path.list), 4, 6), grep, path.list)
,但这会导致 R 会话挂起。
更正。在没有 [[1]]
的情况下重新运行代码:split(path.list, substr(basename(path.list), 4, 6))
。这可能是因为path.list
变量因 R 会话崩溃而丢失。
很高兴听到,没有可重复的例子,它很快就放在一起了。更正答案以上是关于基于未知字符的部分匹配对字符串向量进行子集化的主要内容,如果未能解决你的问题,请参考以下文章