【问题标题】:Compare two data.frames to find similar values from data.frame 1 in data.frame 2比较两个 data.frame 以从 data.frame 1 中的 data.frame 2 中找到相似的值
【发布时间】:2020-06-23 14:48:56
【问题描述】:

我有两个 data.frames:名称和搜索

name <- data.frame(
  A = c("example", "firstly", "second.com")


searches <- data.frame(
  A = c("example.com","secondly","first"),
  B = c("test", "test.com", "test1"))

我想在 data.frame “搜索”中搜索 data.frame “名称”中的值。如果有相似的值(不完全相同),我希望 R 从名称和新表的新行中的搜索返回值。

所以一个新的data.frame可能是

result <- data.frame(
    A = "example", "firstly", "second.com",
    B = "example.com","first","secondly",
    C = "test", "test1", "test.com")

这可能吗?

【问题讨论】:

  • 你如何定义“相似”?在这里看起来有相同的 4 个首字母就足够了 - 是这样吗?
  • 是的,我认为 data.frame "searches" 中的内容应该包含来自 data.frame "name" 内容的 4 个相似的连续字母
  • 如果总是只有前四个字母,那么您可以在带有substring(..., 1, 4) 创建的额外列的框架上使用merge。不过,如果有什么不同,您可以考虑使用fuzzyjoin 包。

标签: r merge


【解决方案1】:

您可以使用 R 中的 stringr 包来执行此操作。例如,如果您有

name <- data.frame(
  A = c("example", "firstly", "second.com"))


searches <- data.frame(
  A = c("example.com","secondly","first"),
  B = c("test", "test.com", "test1"))

那么你可以使用

str_extract(searches$A, '.*example.*')  

这给出了一个输出

> str_extract(searches$A, '.*example.*')  
[1] "example.com" NA            NA 

如果您使用适当的 for 循环进行设置,以迭代 name 数据帧中的元素和 searches 数据帧的单元格,那么您可以选择所有匹配项并根据需要提取它们。

【讨论】:

    【解决方案2】:

    使用来自fuzzyjoin包的函数stringdist_join。

    library(fuzzyjoin)
    
    name <- data.frame(
      A = c("example", "firstly", "second.com")
    )
    
    searches <- data.frame(
      A = c("example.com","secondly","first"),
      B = c("test", "test.com", "test1")
    )
    
    result <- stringdist_join(name, searches, by = "A", max_dist = 5)
    

    哪些结果:

    > print(result)
             A.x         A.y        B
    1    example example.com     test
    2    firstly       first    test1
    3 second.com    secondly test.com
    

    【讨论】:

    • 看起来很完美,不幸的是我收到一个错误:错误:tibble 中的所有列都必须是 1d 或 2d 对象:* Column col 为 NULL 你知道出了什么问题吗?
    • 我不确定是什么导致了这个问题。您是否使用与上面列出的完全相同的 data.frames,或者在对整个数据库进行测试后是否发生了错误(假设有一个)?您使用的是哪个版本的 R?
    • 是的,数据框是一样的。我正在使用 R 版本 1.2.1335。我仍然无法修复它。如果您知道如何解决这个问题,那就太好了
    • 这是tibble的问题。 Fuzzyjoin 在 stringdist_join 函数的某处使用包,这会导致问题。但对我来说,即使掌握了确切的数据,也很难确切地说出问题出在哪里。
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多