2016-03-17 2 views
1

Я работаю над старыми именами списков. Имена людей написаны по-разному, но на самом деле это одни и те же люди. Я использовал пакет stringdist для вычисления расстояния между строками, чтобы найти, что имена, вероятно, одинаковы.Реорганизация и суммирование данных на основе неполного текста соответствия (package 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

х и у объединяются с помощью соответствующих спичечных колонн

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") 
+0

Спасибо за проявленный интерес @Wyldsoul. Однако я не могу основываться на регулярном выражении. Я должен работать над гораздо более крупными данными со многими различными именами людей (и использовать пакет текстовых расстояний) – Wilcar

 Смежные вопросы

  • Нет связанных вопросов^_^