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

ple*_*elp 5 r

我有以下文件名列表:

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")
Run Code Online (Sandbox Code Playgroud)

我想确定哪些文件具有以下子字符串:

toMatch <- c("Fasted", "DWeib NoCmaxW")
Run Code Online (Sandbox Code Playgroud)

我发现的例子经常引用以下用法:

grep(paste(toMatch, collapse = "|"), files.list, value=TRUE)
Run Code Online (Sandbox Code Playgroud)

但是,这会返回四种可能性:

[1] "Fasted DWeib NoCmaxW.xlsx" "Fed DWeib NoCmaxW.xlsx"    "Fasted SWeib NoCmaxW.xlsx"
[4] "Fasted DWeib Cmax10.xlsx"  "Fasted SWeib Cmax10.xlsx" 
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

谢谢你。

akr*_*run 5

我们可以用&

i1 <- grepl(toMatch[1], files.list) & grepl(toMatch[2], files.list)
Run Code Online (Sandbox Code Playgroud)

如果“toMatch”中有多个元素,则使用lapplyand循环它们Reduce到单个vector逻辑&

i1 <- Reduce(`&`, lapply(toMatch, grepl, x = files.list))
files.list[i1]
#[1] "Fasted DWeib NoCmaxW.xlsx"
Run Code Online (Sandbox Code Playgroud)

还可以使用 ie 折叠元素,.*以匹配“toMatch”的第一个单词,后跟单词边界 ( \\b),然后是一些字符 ( ) 以及在“toMatch”的第二个单词之前的.*另一个单词边界 ( )。\\b在这个例子中它有效。可能最好在开头和结尾添加单词边界(本例不需要)

pat1 <- paste(toMatch, collapse= "\\b.*\\b")
grep(pat1, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"
Run Code Online (Sandbox Code Playgroud)

但是,这将在“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"
Run Code Online (Sandbox Code Playgroud)