gpt4 book ai didi

R:在字符串向量中查找多个字符串匹配项

转载 作者:行者123 更新时间:2023-12-01 00:18:46 25 4
gpt4 key购买 nike

我有以下文件名列表:

files.list <- c("Fasted DWeib NoCmaxW.xlsx", "Fed DWeib NoCmaxW.xlsx", "Fasted SWeib NoCmaxW.xlsx", "Fed SWeib NoCmaxW.xlsx", "Fasted DWeib Cmax10.xlsx", "Fed DWeib Cmax10.xlsx", "Fasted SWeib Cmax10.xlsx", "Fed SWeib Cmax10.xlsx")

我想确定哪些文件具有以下子字符串:
toMatch <- c("Fasted", "DWeib NoCmaxW")

我发现的例子经常引用以下用法:
grep(paste(toMatch, collapse = "|"), files.list, value=TRUE)

但是,这会返回四种可能性:
[1] "Fasted DWeib NoCmaxW.xlsx" "Fed DWeib NoCmaxW.xlsx"    "Fasted SWeib NoCmaxW.xlsx"
[4] "Fasted DWeib Cmax10.xlsx" "Fasted SWeib Cmax10.xlsx"

我想要包含 toMatch 两个元素的文件名(即“Fasted”和“DWeib NoCmaxW”)。只有一个文件满足该要求 (files.list[1])。我假设“|”在粘贴命令中可能是逻辑 OR,所以我尝试了“&”,但这并没有解决我的问题。

有人可以帮忙吗?

谢谢你。

最佳答案

我们可以使用 &

i1 <- grepl(toMatch[1], files.list) & grepl(toMatch[2], files.list)

如果 'toMatch' 中有多个元素,用 lapply 循环遍历它们和 Reduce到单个逻辑 vector&
i1 <- Reduce(`&`, lapply(toMatch, grepl, x = files.list))
files.list[i1]
#[1] "Fasted DWeib NoCmaxW.xlsx"

也可以使用 .* 折叠元素即匹配 'toMatch' 的第一个单词,然后是单词边界( \\b ),然后是一些字符( .* )和另一个单词边界( \\b ),然后是 'toMatch' 的第二个单词。在这个例子中它有效。可能最好在开头和结尾添加单词边界(本示例不需要)
pat1 <- paste(toMatch, collapse= "\\b.*\\b")
grep(pat1, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"

但是,这将在 'toMatch' 中以相同的单词顺序查找匹配项。如果有相反顺序的子字符串并希望匹配它们,请创建 pattern以相反的顺序然后折叠 |
pat2 <- paste(rev(toMatch), collapse="\\b.*\\b")
pat <- paste(pat1, pat2, sep="|")
grep(pat, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"

关于R:在字符串向量中查找多个字符串匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50431362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com