r - 处理字符串相似性的有效方法?

标签 r stringdist

我遇到了一些字符串相似性问题。

这是我的数据的样子(原始数据很大):

SerialNumber                SubSerialID            Date

AGCC0775CFNDA1040TMT775     AVCC0775CFNDA1040     2018/01/08
AGCC0775CFNDA1040           AVCC0775CFNDA1040     2015/12/28
AGCC0775CFNDA10407EC        AVCC0775CFNDA1040     2018/03/17
CH~MT765E~C0765HFNCC1056    BGDC0865HFNKG1043     2019/01/07
2658358                     BGDC0865HFNKG1043     2018/08/09
MT765E~C0765KFNCD1044       C0765KFNCD10          2015/04/07
187A126                     C0765KFNCD10          2017/11/31

...

我的目标是:

SerialNumber                SubSerialID            Date 

AGCC0775CFNDA10407EC        AVCC0775CFNDA1040     2018/03/17
CH~MT765E~C0765HFNCC1056    BGDC0865HFNKG1043     2019/01/07
2658358                     BGDC0865HFNKG1043     2018/08/09
MT765E~C0765KFNCD1044       C0765KFNCD10          2015/04/07
187A126                     C0765KFNCD10          2017/11/31

...

序列号 AGCC0775CFNDA1040TMT775AGCC0775CFNDA1040AGCC0775CFNDA10407EC 是同一件事,但由错误引起。我想保留 AGCC0775CFNDA10407EC,因为它有最新的记录日期。但是,我不能直接使用 SubSerialIDDate 来过滤那些序列号,因为如果会删除 2658358

我考虑过使用 stringdist 来查找字符串相似度作为另一个条件(即,通过 abs (similarity) >1.5 和 abs (similarity)<0.5 过滤掉)但无法找到一种有效的方法来处理它。它的数据很大并且使用 for 循环是不切实际的。我被困了一段时间,希望有人能给我一些意见或建议。

最佳答案

以下重现了您的预期输出

library(dplyr)
library(purrr)
df %>%
    mutate(Date = as.Date(Date)) %>%
    mutate_if(is.factor, as.character) %>%
    mutate(dist = map2_dbl(SerialNumber, SubSerialID, adist)) %>%
    group_by(SubSerialID) %>%
    filter(all(dist > 5) | Date == max(Date)) %>%
    ungroup()
## A tibble: 5 x 4
#  SerialNumber             SubSerialID       Date        dist
#  <chr>                    <chr>             <date>     <dbl>
#1 AGCC0775CFNDA10407EC     AVCC0775CFNDA1040 2018-03-17     4
#2 CH~MT765E~C0765HFNCC1056 BGDC0865HFNKG1043 2019-01-07    15
#3 2658358                  BGDC0865HFNKG1043 2018-08-09    15
#4 MT765E~C0765KFNCD1044    C0765KFNCD10      2015-04-07     9
#5 187A126                  C0765KFNCD10      2017-11-30    11

如果 所有 Levenshtein 距离在 SubSerialID 之间,则保留所有条目(根据 SubserialID)和 SerialNumber都大于5。如果有一个距离<= 5 , 只保留最大的行 Date .我保留了 dist调试栏;您可以使用 select(-dist) 删除该列.

我不确定这有多普遍。您将不得不使用 Levenshtein 距离阈值(在本例中我将其设置为 5)。


示例数据

df <- read.table(text =
"SerialNumber                SubSerialID            Date

AGCC0775CFNDA1040TMT775     AVCC0775CFNDA1040     2018/01/08
AGCC0775CFNDA1040           AVCC0775CFNDA1040     2015/12/28
AGCC0775CFNDA10407EC        AVCC0775CFNDA1040     2018/03/17
CH~MT765E~C0765HFNCC1056    BGDC0865HFNKG1043     2019/01/07
2658358                     BGDC0865HFNKG1043     2018/08/09
MT765E~C0765KFNCD1044       C0765KFNCD10          2015/04/07
187A126                     C0765KFNCD10          2017/11/30", header = T)

关于r - 处理字符串相似性的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60271770/

相关文章:

r - 一个向量上的 stringdist

R:将相似地址组合在一起

R:生成具有stringdist和stringdistmatrix的近匹配项列表

r - 从包含变音符号的 csv 创建 RSQLite - 然后使用 dplyr 读入

r - 如何在 R 中的这 2 个场景中为高斯分布生成数据?

r - 将多边形添加到 SpatialPolygonsDataFrame

string - 将 R 向量转换为 1 个元素的字符串向量

r - 如何在 dbplyr 中使用自定义 SQL 函数?

r - 为什么 R stringdist 在 q-gram 距离中返回 Inf,其中一个字符串比 q 短?

当 R 中有多个值选项时,在每个 ID 中重复一个值