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

Posted

技术标签:

【中文标题】在另一个字符串向量中查找字符串向量的匹配项【英文标题】:Find matches of a vector of strings in another vector of strings 【发布时间】:2013-06-12 09:07:46 【问题描述】:

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

# 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

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

%ingrepl() 都不起作用,因为 %in% 似乎要求数据框中的每个单词都被矢量化(articles$text %in% keywords 导致四个 FALSEs),而 grep() 似乎没有能够处理矢量化模式(grep(keywords, articles$text) 给出错误)。这两个函数似乎都不能在多个维度上很好地工作(即,在所有行中搜索一个单词很容易,但不是同时搜索所有 3 个单词)。

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

【问题讨论】:

【参考方案1】:

您可以尝试将您的“关键字”粘贴在一起,并用竖线字符 (|) 将它们分开,这将像“或”一样工作,如下所示:

> 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

【讨论】:

关键字中有需要转义的字符怎么办?是否必须手动转义所有关键字中的所有特殊字符?

以上是关于在另一个字符串向量中查找字符串向量的匹配项的主要内容,如果未能解决你的问题,请参考以下文章

搜索字符串时向量下标超出范围

如何在嵌套循环中匹配来自两个字符串向量的字符串值

C ++将文件行传递给字符串向量

在向量中的字符串中查找字符

对向量使用二分搜索。

匹配在另一个向量中的向量