grep使用具有多种模式的字符向量

我正在尝试使用grep来testing一个stringvector是否存在于另一个vector中,并输出存在的值(匹配模式)。

我有这样的数据框:

 FirstName Letter Alex A1 Alex A6 Alex A7 Bob A1 Chris A9 Chris A6 

我在“Letter”列中find了string模式的向量,例如: c("A1", "A9", "A6")

我想检查模式向量中的任何string是否出现在“Letter”列中。 如果是的话,我想输出独特的值。

问题是,我不知道如何使用多种模式的grep 。 我试过了:

 matches <- unique ( grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE) ) 

但它给了我0比赛这是不正确的,有什么build议吗?

除了@ Marek关于不包含fixed==TRUE的评论之外,还需要在正则expression式中没有空格。 应该是"A1|A9|A6"

你也提到有很多模式。 假设他们在一个向量中

 toMatch <- c("A1", "A9", "A6") 

那么你可以直接从这个创build你的正则expression式。

 matches <- unique (grep(paste(toMatch,collapse="|"), myfile$Letter, value=TRUE)) 

好的答案,但是不要忘记从dplyr filter()

 patterns <- c("A1", "A9", "A6") >your_df FirstName Letter 1 Alex A1 2 Alex A6 3 Alex A7 4 Bob A1 5 Chris A9 6 Chris A6 result <- filter(your_df, grepl(paste(patterns, collapse="|"), Letter)) >result FirstName Letter 1 Alex A1 2 Alex A6 3 Bob A1 4 Chris A9 5 Chris A6 

你有没有尝试match()charmatch()函数?

使用示例:

 match(c("A1", "A9", "A6"), myfile$Letter) 

基于Brian Digg的文章,这里有两个有用的过滤列表function:

 #Returns all items in a list that are not contained in toMatch #toMatch can be a single item or a list of items exclude <- function (theList, toMatch){ return(setdiff(theList,include(theList,toMatch))) } #Returns all items in a list that ARE contained in toMatch #toMatch can be a single item or a list of items include <- function (theList, toMatch){ matches <- unique (grep(paste(toMatch,collapse="|"), theList, value=TRUE)) return(matches) } 

不确定这个答案是否已经出现…

对于问题中的特定模式,你可以用一个grep()调用来完成,

 grep("A[169]", myfile$Letter) 

添加到Brian Diggs的答案。

另一种使用grepl的方式将返回一个包含所有值的数据框。

 toMatch <- myfile$Letter matches <- myfile[grepl(paste(toMatch, collapse="|"), myfile$Letter), ] matches Letter Firstname 1 A1 Alex 2 A6 Alex 4 A1 Bob 5 A9 Chris 6 A6 Chris 

也许有点清洁…也许?

我build议写一个小脚本,并用Grep进行多次search。 我从来没有find一种方法来search多种模式,相信我,我看了!

像这样,你的shell文件,embedded的string:

  #!/bin/bash grep *A6* "Alex A1 Alex A6 Alex A7 Bob A1 Chris A9 Chris A6"; grep *A7* "Alex A1 Alex A6 Alex A7 Bob A1 Chris A9 Chris A6"; grep *A8* "Alex A1 Alex A6 Alex A7 Bob A1 Chris A9 Chris A6"; 

然后通过inputmyshell.sh运行。

如果你想在命令行中传递string,就像这样做,用shell参数 – 这是bash符号btw:

  #!/bin/bash $stingtomatch = "${1}"; grep *A6* "${stingtomatch}"; grep *A7* "${stingtomatch}"; grep *A8* "${stingtomatch}"; 

等等。

如果有很多匹配的模式,你可以把它放在for循环中。