R中的模糊匹配;匹配用户标识符并向匹配的用户标识符添加前缀



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

下面是一个模拟数据帧,描述了我的意思:-

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行中的标识符("+cbead1382f"(与第16行中的相同标识符("+353cbeed1382f"(,但没有+353〃;前缀,第2行与第17行相同,依此类推。例如,如果我对这类数据进行k均值聚类,这可能会有问题,因为它会将一个用户视为两个用户,从而严重扭曲结果。

我想做的是匹配这些标识符,如果匹配,就会添加额外的前缀(在这种情况下为"+353"(+353";。因此,解决方案需要意识到这一点。如有任何帮助,我们将不胜感激:(

这将去掉任何以"+"和后面跟着一个字母,从而为您提供基本标识符。

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

然而,这会过度缩短你的基本id。

在您的示例中,最后10个字符是基本id。在这种情况下,您可以使用以下内容提取基本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

最新更新