R: нечеткое соединение между двумя наборами данных

Мне нужно нечеткое совпадение и получить расстояние между почтовым индексом / адресом в двух разных наборах данных.

Вот пример:

name_a <- c("Aldo", "Andrea", "Alberto", "Antonio", "Angelo")
name_b <- c("Sara", "Serena", "Silvia", "Sonia", "Sissi")

zip_street_a <- c("1204 Roma Street 8", "1204 Roma Street 8", "1204 Roma Street 8", "1204 Venezia street 10", "1204 Venezia Street 110")

zip_street_b <- c("1204 Roma Street 81", "1204 Roma Street 8A", "1204 Roma Street 8B", "1204 Roma Street 8C", "1204 Venezia Street 10C")

db_a <- data.frame(name_a, zip_street_a)
db_b <- data.frame(name_b, zip_street_b)

names(db_a)[names(db_a)=='zip_street_a'] <- 'zipstreet'
names(db_b)[names(db_b)=='zip_street_b'] <- 'zipstreet'

Теперь я использовал library(fuzzyjoin) в сочетании с library(dplyr), чтобы создать следующий сценарий:

match_data <- stringdist_left_join(db_a, db_b,
              by = "zipstreet",
              ignore_case = TRUE,
              method = "jaccard",
              max_dist = 1,
              distance_col = "dist"
) %>%
  Group_by(zipstreet.x)

Скрипт работает нормально. Но хотелось бы иметь разное расстояние между следующими комбинациями адресов:

a) 1204 Roma Street 8 против 1204 Roma Street 81 -> расстояние = 0,0147
b) 1204 Roma Street 8 против 1204 Roma Street 8A -> distance = 0,0147

Теперь улица Рома номер 81 находится очень далеко от улицы Рома 8. С другой стороны, улица Рома номер 8А находится очень близко к улице Рома номер 8.

Итак, мне нужно, чтобы расстояние было очень близко к 0 для 8A и далеко от 0 для 81.

Как это возможно?


person claudia    schedule 12.07.2018    source источник
comment
но кто-то с 1204 Doma Street 8 street все равно будет довольно близко, я не уверен, что вы добьетесь чего-либо с этим подходом ... из пакета ggmap вы найдете geocode функцию, которая даст вам координату gps, тогда вы можете вычислить фактические расстояния   -  person Moody_Mudskipper    schedule 12.07.2018
comment
db_a$zipstreet2 <- gsub("\\D+$","",db_a$zipstreet) избавится от последних символов, которые не являются числами, возможно, это поможет быстро исправить   -  person Moody_Mudskipper    schedule 12.07.2018


Ответы (1)


Расстояние основано на совпадении строк, то есть нечетком совпадении. Но вы говорите о физическом расстоянии между двумя адресами?

В этом случае вам необходимо собрать данные о долготе и широте для каждого адреса.

person Mattias99    schedule 12.07.2018
comment
Хорошо, я отделю название улицы от номера дома. Но разве это не так просто, потому что, например, мне нужно вычитать из: richtistrasse 7A, только часть 7A. Я использую gsub (^ [: digit:]],, mydata), но это занимает всего 7, а не 7A. есть ли решение, на ваш взгляд? - person claudia; 23.07.2018
comment
Попробуйте это, улица ‹- richtistrasse 7A gsub (\\ s * \\ w * $,, street) - person Mattias99; 24.07.2018