Сравнение строк слово за словом и строка за строкой - PullRequest
1 голос
/ 17 октября 2019

У меня есть два набора данных, которые имеют два адресных столбца. Я хочу объединить два набора данных по общему адресу. Но некоторые адреса являются пересечениями, и порядок названий улиц в каждом наборе данных различен. Есть ли способ попросить Rstudio сравнить строки слово за словом, и, если найдено более двух слов, дайте мне знать? Примером является:

"КАБОТ СТ НА РУГГЛЕС СТ" и "РУГГЛС СТ НА КАБОТ СТ"

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Этот код переупорядочивает слова в адресах в алфавитном порядке, поэтому вы можете проверить, совпадают ли два адреса.

library(stringr)
df =  data.frame(address = c("CABOT ST AT RUGGLES ST", "RUGGLES ST AT CABOT ST"))

# split the address into words
list_split <- str_split(df$address,' ')
#[[1]]
#[1] "CABOT"   "ST"      "AT"      "RUGGLES" "ST"     

#[[2]]
#[1] "RUGGLES" "ST"      "AT"      "CABOT"   "ST"

# sort the words
list_sort <- map(list_split, sort)
#[[1]]
#[1] "AT"      "CABOT"   "RUGGLES" "ST"      "ST"     

#[[2]]
#[1] "AT"      "CABOT"   "RUGGLES" "ST"      "ST"  

# paste all the words reordered together
list_pasted <-  map(list_sort,function(x) paste(x,collapse= " "))
#[[1]]
#[1] "AT CABOT RUGGLES ST ST"

#[[2]]
# [1] "AT CABOT RUGGLES ST ST"

# unlist to convert to vector and assign to a new column
df$address_sorted <- unlist(list_pasted)
#                 address         address_sorted
#1 CABOT ST AT RUGGLES ST AT CABOT RUGGLES ST ST
#2 RUGGLES ST AT CABOT ST AT CABOT RUGGLES ST ST

Если у вас есть два столбца адресов, вы можете сделать то же самое для другого столбца. и сравнить их вместе

0 голосов
/ 17 октября 2019

Я не уверен, что простого сравнения обеих строк для более чем двух похожих слов будет достаточно для решения вашей проблемы. Однако это можно сделать таким образом, используя функцию str_split из пакета stringr. Я также добавил способ удаления ненужных слов из сравнений, таких как «ST» и «AT»:

# List of words to exclude from the comparisons
excluded <- c("ST", "AT")

# Addresses to compare
ad_1 <- "CABOT ST AT RUGGLES ST"
ad_2 <- "RUGGLES ST AT CABOT ST"

# Get unique list of words in each address
ad_1_d <- unique(str_split(ad_1, " ")[[1]])
ad_2_d <- unique(str_split(ad_2, " ")[[1]])

# Remove words from the vector above
ad_1_d <- ad_1_d[!ad_1_d %in% excluded]
ad_2_d <- ad_2_d[!ad_2_d %in% excluded]

if (sum(ad_1_d %in% ad_2_d) >= 2 || sum(ad_2_d %in% ad_1_d) >= 2) {
  message("Similar addresses.")
}
...