【问题标题】:Partial Matching two data frames having a common column(by words) in R/Python在 R/Python 中部分匹配具有公共列(按字)的两个数据帧
【发布时间】:2015-02-14 15:27:43
【问题描述】:

我有两个数据框作为 csv 文件,其中 df1 的行数比 df2 多:

Df1

Name                         Count
xxx yyyyyy bbb cccc           15
fffdd 444 ggg                 20
kkbbb ccc dd 29p              5
22 cc pbc2 kmn3 b23 efgh      4
ccccccccc sss qqqq            2

Df2

Name
xxx yyyyyy bbb cccc
ccccccccc sss qqqq pppc
22 cc pbc2 kmn3 b23,efgh

我想通过匹配前两个/三个单词来进行部分匹配(近似/模糊匹配)。基本上输出会是这样的:

输出:

Name                       Count
xxx yyyyyy bbb cccc         15
22 cc pbc2 kmn3 b23 efgh    4
ccccccccc sss qqqq          2

通过尝试完全匹配,我遗漏了一些行。我尝试在 R 中使用agrep,但不知何故它不起作用并且模糊匹配非常慢。请建议我在 R 或 python 中执行此操作。任何帮助表示赞赏!

【问题讨论】:

    标签: python regex r agrep


    【解决方案1】:

    在 R 中,您可以使用 agrep 进行模糊匹配。您可以使用max.distance 参数设置匹配允许的最大距离。

    DF1[sapply(DF2$Name, agrep, DF1$Name, max.distance = 0.2), ]
    
    #                       Name Count
    # 1      xxx yyyyyy bbb cccc    15
    # 5       ccccccccc sss qqqq     2
    # 4 22 cc pbc2 kmn3 b23 efgh     4
    

    数据:

    DF1 <- read.table(text = "Name                         Count
    'xxx yyyyyy bbb cccc'           15
    'fffdd 444 ggg '                20
    'kkbbb ccc dd 29p'              5
    '22 cc pbc2 kmn3 b23 efgh'      4
    'ccccccccc sss qqqq'           2", header = TRUE, stringsAsFactors = FALSE)
    
    DF2 <- read.table(text = "Name
    'xxx yyyyyy bbb cccc'
    'ccccccccc sss qqqq pppc'
    '22 cc pbc2 kmn3 b23,efgh'", header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 谢谢!!我正在使用相同的代码,但是当数据量很大时它非常慢。你知道其他更快的方法吗?
    • @warwick12 不幸的是,模糊匹配非常慢。您可以尝试一种迭代方法,从可能的匹配集中删除匹配,以减少每个步骤中的比较次数。当然,您必须跟踪原始行号。
    • 不错的答案。 stringdist() 是否只适用于数字匹配?
    • 谢谢!我收到这个错误。你知道这个错误的可能原因吗:[.default(xj, i) 中的错误:无效的下标类型'list'?
    • @warwick12 我想算法找到了超过 1 个匹配字符串。
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2018-10-03
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多