在另一个字符串向量中查找字符串向量的匹配项

And*_*rew 13 grep r string-matching grepl

我正在尝试创建一个新闻文章数据框的子集,其中至少提到一组关键字或短语的一个元素.

# Sample data frame of articles
articles <- data.frame(id=c(1, 2, 3, 4), text=c("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod", "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,", "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo", "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse"))
articles$text <- as.character(articles$text)

# Sample vector of keywords or phrases
keywords <- as.character(c("elit", "tempor incididunt", "reprehenderit"))

#   id                                                                         text
# 1  1     Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
# 2  2 tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
# 3  3      quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
# 4  4    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
Run Code Online (Sandbox Code Playgroud)

给定关键字的向量,子集应包含行1,2和4,因为这些行包含向量的一个或多个元素.

既不是%in也不grepl()工作,因为%in% 似乎要求数据帧中的每个字都被矢量化(articles$text %in% keywords导致四个FALSEs),并且grep()似乎不能处理矢量化模式(grep(keywords, articles$text)给出错误).单独的功能似乎都不能在多个维度上很好地工作(即,在所有行中搜索一个单词很容易,但不能同时搜索所有3个单词).

查找和选择包含关键字向量的至少一个元素的数据框的所有行的最佳方法是什么?

A5C*_*2T1 16

您可以尝试将"关键字"粘贴在一起,并将它们与管道字符(|)分开,它们的工作方式类似于"或",如下所示:

> articles[grepl(paste(keywords, collapse="|"), articles$text),]
  id                                                                         text
1  1     Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
2  2 tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
4  4    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
Run Code Online (Sandbox Code Playgroud)