我正在对用户生成的日志数据集进行二次数据分析,我注意到一个用户有两个不同的用户标识符;主要区别在于在重复的标识符前面有一个附加前缀。
下面是一个模拟数据帧,描述了我的意思:-
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