如何检查R中列表中是否包含短语列表中的任何单词?

时间:2015-06-15 21:39:12

标签: r string match vectorization string-matching

我有一个数据框,其中包含一个名为listA的列和一个listB。我想只拉出数据框中与listB中的条目匹配的那些行,所以我有:

newData <- mydata[mydata$listA %in% listB,]

但是,listA的某些条目的格式为&#34; ABC /// DEF&#34 ;,其中ABC和DEF都是listB中的可能条目。 我想拉出数据框的行,这些行具有listA,其中任何单词与listB中的条目匹配。所以如果listB有&#34; ABC&#34;在其中,该条目将包含在newData中。我找到了strsplit函数,但是像

这样的东西
strsplit(mydata$listA," ") %in% listB

总是返回FALSE,大概是因为它检查strsplit返回的整个列表是否是listB中的一个条目。

1 个答案:

答案 0 :(得分:4)

  1. match(word_vector, target_vector)允许两个参数都是向量,这是你想要的(注意:那是向量,而不是列表)。事实上,%in%运算符是match()的同义词,正如其帮助告诉您的那样。
  2. stringi包的方法stri_match_*可能会直接执行您想要的操作,所有操作都会进行矢量化,并且比match()strsplit()更高效: stri_match_all stri_match_all_regex stri_match_first stri_match_first_regex stri_match_last stri_match_last_regex
  3. 此外,您可能不需要使用显式拆分功能,但如果必须,则使用stringi::stri_split_*(),避免使用base::strsplit()

    关于性能的注意事项:尽可能避免像R中的瘟疫一样分裂字符串,它会通过不必要的conscells创建内存泄漏,因为gc()会告诉你。这是stringi效率非常高的另一个原因。