【问题标题】:R - Finding partial matches in strings between two vectorsR - 在两个向量之间的字符串中查找部分匹配
【发布时间】:2019-12-04 20:23:17
【问题描述】:

我正在一家公司处理几组数据,其中某些团队编写项目代码的方式与其他团队略有不同。

例如,A 组使用 5 字符项目代码 C106A,而 B 组使用 HD-01C106A00 等长代码。注意匹配的字符。

我要做的是将所有这些项目数据组合在一起,数据清理的关键步骤是修复这些代码,以便我可以按它们进行分组。我有一个包含所有长代码的库,因为 B 组对它们有更多的规定,所以我可以依靠他们的数据。

我想让我的代码使用 A 组数据中的字符串在 B 组的库中执行搜索,当它找到 B 组中的匹配集时,替换 A 组数据中的值。我一直在玩 Stringr 的 str_detect 命令,我似乎无法让它工作。

A组项目代码部分:

Project.Code

C106A

C117A

C254A

C342A

C365A

C371A

C391A

C397A

C397B

C397C

C399A

C400A

C404A

C405A

C414A

C417A

B 组图书馆的一部分:

Project.Code

HP-C3651001

HP-C3651003

HP-C3651009

HP-C3651P00

HP-C365A000

HP-C365B000

HP-C3421001

HP-C3421002

HP-C3421003

HP-C3421P00

HP-C342A000

HP-C1061001

HP-C1061011

HP-C1061013

HP-C1061016

HP-C1061P00

HP-C106A000

这样的事情是有意义且有效的:

str_detect(GroupA$Project.Code,"C365A")

但我似乎不能这样做:

str_detect(GroupA$Project.Code,GroupB$Project.Code)

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    一种选择是将paste 转换为单个字符串,其中| 表示OR

    library(stringr)
    str_detect(GroupB$Project.Code, str_c(GroupA$Project.Code, collapse ="|"))
    

    【讨论】:

    • 嗯,这是一个有趣的用途。我会测试一下 - 一旦我能得到这个,我认为替换值是使用 dplyr 和 str_detect 的其余部分的一个相对微不足道的情况
    • 所以问题在于,没有好的方法可以确定哪种情况与哪种情况匹配 - 我需要更具体。
    • @OfTheAzureSky 您可以使用str_match 提取矩阵中的值,然后从中获取索引
    【解决方案2】:

    不确定以下是否是您想要的

    idx <- Filter(length,sapply(grpA, function(x) grep(x,grpB)))
    df <- data.frame(grpA_idx = match(names(idx),grpA),grpA_code =names(idx), grpB_code=grpB[unlist(idx)])
    

    给出:

    > df
      grpA_idx grpA_code   grpB_code
    1       1     C106A HP-C106A000
    2       4     C342A HP-C342A000
    3       5     C365A HP-C365A000
    

    数据

    grpA <- c("C106A", "C117A", "C254A", "C342A", 
                                       "C365A", "C371A", "C391A", "C397A", "C397B", "C397C", "C399A", 
                                       "C400A", "C404A", "C405A", "C414A", "C417A")
    grpB <- c("HP-C1061001", "HP-C1061011", "HP-C1061013", "HP-C1061016", 
                  "HP-C1061P00", "HP-C106A000", "HP-C3421001", "HP-C3421002", "HP-C3421003", 
                  "HP-C3421P00", "HP-C342A000", "HP-C3651001", "HP-C3651003", "HP-C3651009", 
                  "HP-C3651P00", "HP-C365A000", "HP-C365B000")
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2011-05-15
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多