13

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

# 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 行,因为这些行包含向量的一个或多个元素。

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

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

4

1 回答 1

17

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

> 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
于 2013-06-16T04:17:23.093 回答