Изменение формы и резюмирования 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")