【问题标题】:How to check if any words in a list of phrases are contained in a list in R?如何检查短语列表中的任何单词是否包含在R中的列表中?
【发布时间】:2015-08-31 13:16:29
【问题描述】:

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

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

但是,listA 的某些条目的格式为“ABC /// DEF”,其中 ABC 和 DEF 都可能是 listB 中的条目。 我想提取具有 listA 的数据框的行,其中任何单词都与 listB 中的条目匹配。因此,如果 listB 中包含“ABC”,则该条目将包含在 newData 中。我找到了 strsplit 函数,但是像

strsplit(mydata$listA," ") %in% listB

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

【问题讨论】:

  • 您解决此问题的尝试很不错,但您没有提供可重现的示例,也没有提供您想要的输出。
  • mydata[any(unlist(strsplit(mydata$listA, " /// ")) %in% listB), ] 这样的东西怎么样?
  • 谢谢亚历克斯,这让我更接近了。现在的问题是,它评估的是整个 listA,而不是一次一行。 unlist(strsplit(mydata$listA, " /// ")) 返回整个列表中的所有单词,因此 any() 始终返回 TRUE。也许某种应用功能......
  • 是的,我认为这是因为unlist。另一种可能性是查看grepl,尽管它没有通过模式参数进行矢量化。
  • 这可能过于复杂,但请尝试将unlist(lapply(strsplit(mydata$listA, " /// "), function(x) any(x %in% listB))) 作为行子集条件。

标签: r string match vectorization string-matching


【解决方案1】:
  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

此外,您可能不需要使用显式拆分函数,但如果必须,请使用stringi::stri_split_*(),避免使用base::strsplit()

性能注意事项:尽可能避免像 R 中的瘟疫那样拆分字符串,它会通过不必要的 conscell 造成内存泄漏,gc() 会告诉你。这也是stringi 非常高效的另一个原因。

【讨论】:

  • 谢谢!那个包非常有用。
猜你喜欢
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多