Изменение формы и резюмирования data.frame на основе текста с частичным соответствием (package stringdist)

Я работаю над старым списком имен. Имена людей пишутся по-разному, но на самом деле это одни и те же люди. Я использовал пакет stringdist для вычисления расстояния между строками, чтобы найти имена, которые, вероятно, совпадают.

Небольшой пример моих данных:

 data <- data.frame(column1 = c("Lalande, Pierre","Lalande, P","Tertre, Girard ","Tertre Girard du"),
                    column2 = c(4, 5, 10, 1))

Что это дает:

            column1 column2
    Lalande, Pierre       4
         Lalande, P       5
    Tertre, Girard       10
   Tertre Girard du       1

Что я пробовал: используя пакет stringdist

 library (stringdist)
 distance <- stringdistmatrix(data$column1,
                              useNames="strings",
                              method="lv")
 distance2 = as.matrix(distance)

Расстояние <5: квазиравные строки

             Lalande, Pierre Lalande, P Tertre, Girard 
Lalande, P                     5                           
Tertre, Girard                11         13                
Tertre Girard du              14         15          3

Перестройка

library(reshape2)
out <- unique(melt(distance2))

Что это дает:

           Var1             Var2     value
1   Lalande, Pierre  Lalande, Pierre     0
2        Lalande, P  Lalande, Pierre     5
3   Tertre, Girard   Lalande, Pierre    11
4  Tertre Girard du  Lalande, Pierre    14
5   Lalande, Pierre       Lalande, P     5
6        Lalande, P       Lalande, P     0
7   Tertre, Girard        Lalande, P    13
8  Tertre Girard du       Lalande, P    15
9   Lalande, Pierre  Tertre, Girard     11
10       Lalande, P  Tertre, Girard     13
11  Tertre, Girard   Tertre, Girard      0
12 Tertre Girard du  Tertre, Girard      3
13  Lalande, Pierre Tertre Girard du    14
14  Lalande, P Tertre Girard du         15
15  Tertre, Girard  Tertre Girard du     3
16 Tertre Girard du Tertre Girard du     0

сохраняя только хорошие линии:

out2 <- out %>%
   filter (value>0 & value<5)
out2

окончательно но без моей колонки 3!

          Var1             Var2     value
1 Tertre Girard du  Tertre, Girard      3
2  Tertre, Girard  Tertre Girard du     3

Как это сделать? (суммируя мои исходные значения data.frame column2)

Var1            Var2                 Column3(summing)
Lalande, Pierre    Lalande, P               9                
Tertre, Girard    Tertre Girard du         11

1 ответ

Я уверен, что есть более чистый способ сделать это, но это работает в базе R.

 data <- data.frame(column1 = c("Lalande, Pierre","Lalande, P","Tertre, Girard ","Tertre Girard du"),
               column2 = c(4, 5, 10, 1))

создать столбец на основе сопоставления с образцом

 data$column3 <- gsub(",.*| .*",  "", data$column1) 

здесь х часть слияния мы распаковываем и преобразуем столбцы 1 и 3

для у части слияния мы агрегируем по столбцу совпадения 3

x и y объединены соответствующими столбцами соответствия

  merge(t(unstack(data[c(1,3)])),aggregate(data$column2, by=list(gsub(",.*| .*",  "", data$column1)), FUN=sum), by.x = "row.names", by.y = "Group.1")
Другие вопросы по тегам