我有以下文件名列表:
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元素的文件名(即&#34;禁食&#34;和&#34; DWeib NoCmaxW&#34;)。只有一个文件满足该要求(files.list [1])。我假设&#34; |&#34;在粘贴命令中可能是一个逻辑OR,所以我尝试了#34;&amp;&#34;,但这并没有解决我的问题。
有人可以帮忙吗?
谢谢。
答案 0 :(得分:4)
我们可以使用&
i1 <- grepl(toMatch[1], files.list) & grepl(toMatch[2], files.list)
如果“匹配”中有多个元素,请使用lapply
和Reduce
将这些元素循环到具有vector
的单个逻辑&
i1 <- Reduce(`&`, lapply(toMatch, grepl, x = files.list))
files.list[i1]
#[1] "Fasted DWeib NoCmaxW.xlsx"
也可以使用.*
折叠元素,即匹配&#39; toMatch&#39;的第一个单词。接下来是单词边界(\\b
),然后是一些字符(.*
)和另一个单词边界(\\b
),然后是第二个单词“toMatch&#39;”。在这个例子中,它有效。也许最好在开头和结尾添加单词边界(这个例子不需要)
pat1 <- paste(toMatch, collapse= "\\b.*\\b")
grep(pat1, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"
但是,这将在&#39; toMatch&#39;中以相同的单词顺序查找匹配项。如果,如果子序列的顺序相反并且想要匹配它们,则按相反顺序创建pattern
,然后使用|
pat2 <- paste(rev(toMatch), collapse="\\b.*\\b")
pat <- paste(pat1, pat2, sep="|")
grep(pat, files.list, value = TRUE)
#[1] "Fasted DWeib NoCmaxW.xlsx"