使用grep时返回匹配的值

时间:2016-04-19 07:26:10

标签: r string text grep

我正在使用grep函数来识别字符串列表(或字符串col)是否部分存在于特定col(查询)中。

test$result <- sapply(test$query,function(x) ifelse(grep(paste(listofstring,collapse="|"),x),1,0))

有没有办法获得匹配的字符串而不是二进制输出?

例如:

listofstring <- c("Mac","Windows","Linux","Android")
test <- data.frame(query = c("I love Mac","I love Ubuntu","I love Android","I love both Android and Linux"))

使用上面的代码我可以得到输出:

Query                               Result
I love Mac                            1
I love Ubuntu                      logical(0)
I love Android                         1
I love both Android and Linux          1

但我真正想要的是匹配的值和所需的输出:

Query                              Result
I love Mac                          Mac
I love Ubuntu                       N/A
I love Android                     Android
I love both Android and Linux      Android
I love both Android and Linux       Linux

1 个答案:

答案 0 :(得分:1)

我们可以尝试str_extract

library(stringr)
stack(setNames(lapply(str_extract_all(test$query, 
      paste(listofstring,collapse="|")), function(x)
      if(length(x)==0) NA else x), test$query))[2:1]
#                            ind  values
#1                    I love Mac     Mac
#2                 I love Ubuntu    <NA>
#3                I love Android Android
#4 I love both Android and Linux Android
#5 I love both Android and Linux   Linux

在评论中使用字符串

str1 <- "a b c d e f g h"
str_match_all(str1, "(?=(a b|b c|c d))")[[1]][,2]
#[1] "a b" "b c" "c d"