Нечеткое сопоставление в R; возвращает общую строку символов между почти повторяющимися идентификаторами пользователей

#r #match #character

#r #совпадение #символ

Вопрос:

Я работаю со вторичными данными о событиях пользователя, которые были собраны за последние несколько лет. Поставщики в какой-то момент времени изменили системы, и при этом это привело к путанице в столбце идентификатора пользователя. Что произошло, так это то, что в новой системе перед каждым идентификатором пользователя был добавлен префикс (неопределенной длины), что означает, что для одного пользователя существует два идентификатора пользователя. Вот примерный пример ниже:-

 
UserId<-c(" 7450df38c6a2c2b18e06", " 6547e4e1645868458dcd", " 3fde2905308abe637fda", 
  " 0d7c1f693fbde98e5214", " 059a31bfea92fae4d292", " 58de3eee8b7b0afef0bf", 
  " 01cdee6d0425f3184b1b", " 2e35e45b40213031e320", " 89de669da4accdf77c14", 
  " 80327216548b4d95fe05", " 8a47ddaace37c5a5870d", " 5415d85869372f40b6f5", 
  " 5f2a35a157cc7c2d1b09", " e0c57b9d284cf300b12f", " dc9412a08dc9e321c4ca", 
  " 2127450df38c6a2c2b18e06", " 2126547e4e1645868458dcd", " 21433fde2905308abe637fda", 
  " 2150d7c1f693fbde98e5214", " 215059a31bfea92fae4d292", " 215458de3eee8b7b0afef0bf", 
  " 215401cdee6d0425f3184b1b", " 2182e35e45b40213031e320", " 21889de669da4accdf77c14", 
  " 218880327216548b4d95fe05", " 21118a47ddaace37c5a5870d", " 2115415d85869372f40b6f5", 
  " 2105f2a35a157cc7c2d1b09", " 2100e0c57b9d284cf300b12f", " 244dc9412a08dc9e321c4ca"
)
UserId
 

Вот почти дублированные идентификаторы пользователей для 15 уникальных пользователей (по 2 для каждого пользователя в этом примере). Начиная с 15-го идентификатора, мы видим, что новый префикс добавляется, например, 212, 2154 и т.д. В моем реальном наборе данных этот новый префикс может иметь длину 3-5 цифр; он не полностью определен для всех случаев.

Что мне нужно, так это решение, которое предоставит мне общий идентификатор для дублированных идентификаторов, предпочтительно состоящий из общих свойств в каждом дубликате. Например: » 7450df38c6a2c2b18e06″ amp; » 2127450df38c6a2c2b18e06″ = «7450df38c6a2c2b18e06».

Существует ли эффективное решение, которое выполняло бы это в большом наборе данных пользовательских событий?

Комментарии:

1. Вы проверили fuzzyjoin соответствующий пакет? Вы можете определить сходство / различие строк, и это должно быть довольно легко, если вы определите необходимое расстояние между строками, которое всегда должно быть одинаковым, если последняя строка пользователя осталась неизменной между двумя наборами данных.

2. Если вы ищете префиксы или суффиксы, база R может это сделать.

Ответ №1:

Попробуйте это решение:

Установите базовую длину вашего идентификатора, например, 21 символ:

 basic_length<-21
 

Удалить префикс событий, содержащий только последние 21 символ:

 to_compare<-substr(UserId,(nchar(UserId)-basic_length) 2,nchar(UserId))
 

Идентифицировать дубликаты с помощью duplicated функции R.:

 dup<-duplicated(to_compare)
 

Здесь список дублированных базовых идентификаторов:

 substr(UserId[dup],(nchar(UserId)-basic_length) 2,nchar(UserId))
 [1] "2127450df38c6a2c2b18" "2126547e4e1645868458" "21433fde2905308abe63"
 [4] "2150d7c1f693fbde98e5" "215059a31bfea92fae4d" "215458de3eee8b7b0afe"
 [7] "215401cdee6d0425f318" "2182e35e45b40213031e" "21889de669da4accdf77"
[10] "218880327216548b4d95" "21118a47ddaace37c5a5" "2115415d85869372f40b"
[13] "2105f2a35a157cc7c2d1" "2100e0c57b9d284cf300" "244dc9412a08dc9e321c"
 

Если целью вашей проблемы является только получение уникального идентификатора, вы можете легко использовать эту функцию:

 paste(" ",substr(UserId,(nchar(UserId)-basic_length) 2,nchar(UserId)),sep="")
 [1] " 7450df38c6a2c2b18e06" " 6547e4e1645868458dcd" " 3fde2905308abe637fda"
 [4] " 0d7c1f693fbde98e5214" " 059a31bfea92fae4d292" " 58de3eee8b7b0afef0bf"
 [7] " 01cdee6d0425f3184b1b" " 2e35e45b40213031e320" " 89de669da4accdf77c14"
[10] " 80327216548b4d95fe05" " 8a47ddaace37c5a5870d" " 5415d85869372f40b6f5"
[13] " 5f2a35a157cc7c2d1b09" " e0c57b9d284cf300b12f" " dc9412a08dc9e321c4ca"
[16] " 7450df38c6a2c2b18e06" " 6547e4e1645868458dcd" " 3fde2905308abe637fda"
[19] " 0d7c1f693fbde98e5214" " 059a31bfea92fae4d292" " 58de3eee8b7b0afef0bf"
[22] " 01cdee6d0425f3184b1b" " 2e35e45b40213031e320" " 89de669da4accdf77c14"
[25] " 80327216548b4d95fe05" " 8a47ddaace37c5a5870d" " 5415d85869372f40b6f5"
[28] " 5f2a35a157cc7c2d1b09" " e0c57b9d284cf300b12f" " dc9412a08dc9e321c4ca"
 

Как вы можете видеть, позиции [1] и [16] имеют одинаковое значение:

 out[1]==out[16]
[1] TRUE
 

Комментарии:

1. Это сработало очень хорошо, дало мне общий идентификатор; именно то, что я искал, спасибо!