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

时间:2013-06-16 04:12:27

标签: r grep 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

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

%ingrepl()都不起作用,因为%in%似乎要求对数据框中的每个字进行矢量化(articles$text %in% keywords会导致四个FALSE s ),grep()似乎无法处理矢量化模式(grep(keywords, articles$text)给出错误)。单独的功能似乎都不能在多个维度上很好地工作(即,在所有行中搜索一个单词很容易,但不能同时搜索所有3个单词)。

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

1 个答案:

答案 0 :(得分: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