【问题标题】:Find strings from dataframe A whose substring is present in B从数据帧 A 中查找其子字符串存在于 B 中的字符串
【发布时间】:2017-04-25 23:15:43
【问题描述】:

我有两个数据框 A 和 B。 A 有完整的句子,B 有我正在寻找的重复短语。我想在 A 中找到所有行,其中字符串/字符串的一部分存在于数据帧 B 中。 例如,

数据框 A 有:

    "Sally is great"
     "John is great"
  "Sally likes peas"
 "John likes onions"
  "Jane is in Paris"
"Archie is in Paris"

数据框 B 有:

"in Paris"
"is great"

输出将是:

    "Sally is great"
     "John is great"
  "Jane is in Paris"
"Archie is in Paris"

因为这些是在数据帧 B 中存在字符串/子字符串的行。

等价于 SQL 中的 WHERE x LIKE '%substring%' 但针对一组子字符串

我在 A 中有近 200 万行,在 B 中有约 300000 行。我曾考虑使用带循环的 str_match,但考虑到数据大小,这可能不是一个可行的解决方案

【问题讨论】:

  • 好的,在更多搜索中,我意识到 str_match_all 可能会完成这项工作,所以测试一下。我可以查看其他任何功能/包吗?

标签: r string substring string-comparison


【解决方案1】:

一种方法是遍历较小集合的元素并使用grep检查它是否存在于较大集合中。

big = c("Sally is great",
        "John is great",
        "Sally likes peas",
        "John likes onions",
        "Jane is in Paris",
        "Archie is in Paris")
small = c("in Paris",
          "is great")

big[unlist(lapply(small, function(a) grep(a, big)))]
#[1] "Jane is in Paris"   "Archie is in Paris" "Sally is great"     "John is great"     

【讨论】:

    【解决方案2】:

    我们可以从stringi使用stri_detect

    library(stringi)
    big[stri_detect(big, regex = paste(small, collapse="|"))]
    #[1] "Sally is great"     "John is great"      "Jane is in Paris"  
    #[4] "Archie is in Paris"
    

    数据

    big <- c("Sally is great",
        "John is great",
        "Sally likes peas",
        "John likes onions",
        "Jane is in Paris",
        "Archie is in Paris")
    small <- c("in Paris",
          "is great")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2022-11-27
      • 2016-10-21
      • 2014-03-23
      相关资源
      最近更新 更多