【问题标题】:Fuzzy matching in R; matching user identifiers and adding prefix to matched user identifiersR中的模糊匹配;匹配用户标识符并为匹配的用户标识符添加前缀
【发布时间】:2020-12-17 12:54:35
【问题描述】:

我正在对用户生成的日志数据集进行二次数据分析,我注意到一个用户有 2 个不同的用户标识符;主要区别在于重复的标识符前面多了一个前缀。

这是一个模拟数据框,描述了我的意思:-

UserId<-c("+cbeed1382f", "+f50197eebb", "+c3e6a4cbc9", "+27bc490129", 
          "+adcadf6cd4", "+e10ca42ce8", "+1744b26118", "+de1e9f6506", "+8aac93c8fd", 
          "+72bed51a4a", "+6a6c7d444b", "+8636fdc4c7", "+6fa2d04df3", "+d4e9b6cf42", 
          "+536fa504a2", "+353cbeed1382f", "+353f50197eebb", "+353c3e6a4cbc9", 
          "+35327bc490129", "+353adcadf6cd4", "+353e10ca42ce8", "+3531744b26118", 
          "+353de1e9f6506", "+3538aac93c8fd", "+35372bed51a4a", "+3536a6c7d444b", 
          "+3538636fdc4c7", "+3536fa2d04df3", "+353d4e9b6cf42", "+353536fa504a2")

Value<-c(8995L, 8746L, 9920L, 4765L, 2489L, 4894L, 2486L, 4782L, 5632L, 
         7784L, 5642L, 3642L, 1123L, 2036L, 2561L, 963L, 562L, 214L, 365L, 
         785L, 465L, 211L, 111L, 256L, 234L, 895L, 441L, 25L, 698L, 478L)

df<-as.data.frame(cbind(UserId,Value))
View(df)

df

           UserId Value
1     +cbeed1382f  8995
2     +f50197eebb  8746
3     +c3e6a4cbc9  9920
4     +27bc490129  4765
5     +adcadf6cd4  2489
6     +e10ca42ce8  4894
7     +1744b26118  2486
8     +de1e9f6506  4782
9     +8aac93c8fd  5632
10    +72bed51a4a  7784
11    +6a6c7d444b  5642
12    +8636fdc4c7  3642
13    +6fa2d04df3  1123
14    +d4e9b6cf42  2036
15    +536fa504a2  2561
16 +353cbeed1382f   963
17 +353f50197eebb   562
18 +353c3e6a4cbc9   214
19 +35327bc490129   365
20 +353adcadf6cd4   785
21 +353e10ca42ce8   465
22 +3531744b26118   211
23 +353de1e9f6506   111
24 +3538aac93c8fd   256
25 +35372bed51a4a   234
26 +3536a6c7d444b   895
27 +3538636fdc4c7   441
28 +3536fa2d04df3    25
29 +353d4e9b6cf42   698
30 +353536fa504a2   478

如您所见,第 1 行中的标识符(“+cbeed1382f”)与第 16 行(“+353cbeed1382f”)中的标识符相同,但没有“+353”前缀,第 2 行与第 17 行相同, 等等。例如,如果我对这种类型的数据进行 k-means 聚类,这可能会出现问题,因为它会将一个用户视为两个用户,从而严重扭曲结果。

我想要做的是匹配这些标识符,如果匹配,将添加额外的前缀(在本例中为“+353”)。有一个警告:一些前缀是 3、4 或 5 位长,不一定以“+353”开头。所以解决方案需要意识到这一点。任何帮助将不胜感激:)

【问题讨论】:

  • 每个base id都以字母开头吗?每个前缀是否只包含数字?
  • 嗨@BrianLang,每个基本ID都可以以数字或字母开头(前面带有+符号)。
  • 啊,我现在明白了。基本 ID 是否有固定数量的字符?

标签: r match fuzzy-comparison


【解决方案1】:

这将删除所有以“+”为前缀并后跟一个字母的数字,从而为您提供基本标识符。

df %>% 
 dplyr::mutate(base_id = stringr::str_remove(UserId,
                                             pattern = "(?<=\\+)[0-9]+(?=[a-z])")) %>% 
 dplyr::arrange(base_id)

但是,这会过度缩短您的基本 ID。

在您的示例中,最后 10 个字符是基本 ID。在这种情况下,您可以使用以下方法提取基础:

df %>% 
 dplyr::mutate(base_id = stringr::str_remove(UserId,
                                             pattern = "(?<=\\+)[0-9]+(?=[a-z0-9]{10}$)")) %>% 
 dplyr::arrange(base_id)

特别选择 [a-z] 和 [0-9] 的 10 个字符前面的任何内容

           UserId Value     base_id
1     +1744b26118  2486 +1744b26118
2  +3531744b26118   211 +1744b26118
3     +27bc490129  4765 +27bc490129
4  +35327bc490129   365 +27bc490129
5     +536fa504a2  2561 +536fa504a2
6  +353536fa504a2   478 +536fa504a2
7     +6a6c7d444b  5642 +6a6c7d444b
8  +3536a6c7d444b   895 +6a6c7d444b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多