Один из подходов к этой проблеме - использовать stri_replace_all_regex
из stringi
. Он принимает векторизованные шаблоны и замены.
Мы можем использовать подстановочный знак \b
для границ слов, который сам должен быть экранирован до \\b
. Чтобы позаботиться о случае, когда аббревиатура заканчивается .
, мы можем сопоставить литерал .
или \b
с (\\.|\\b)
.
. Я создаю шаблон и векторы замены из ваших данных в конец ответа.
library(stringi)
stri_replace_all_regex("101 ST. LN",pattern = terms[[1]], replacement = terms[[2]],vectorize_all = FALSE)
[1] "101 STREET LANE"
То же самое работает для вектора строк, для которых должны быть сделаны замены.
data <- data.frame(address = c("1 N ST", "2 E AVE", "3 S RD", "4 SE LN"))
stri_replace_all_regex(data$address,pattern = terms[[1]], replacement = terms[[2]],vectorize_all = FALSE)
#[1] "1 NORTH STREET" "2 EAST AVENUE" "3 SOUTH ROAD" "4 SOUTH EAST LANE"
Данные
terms <- c("ST", "STREET", "RD", "ROAD", "AVE", "AVENUE", "N", "NORTH",
"W", "WEST", "S", "SOUTH", "E", "EAST", "STE", "SUITE", "HWY",
"HIGHWAY", "DR", "DRIVE", "NW", "NORTH WEST", "NE", "NORTH EAST",
"SW", "SOUTH WEST", "SE", "SOUTH EAST", "LN", "LANE", "WAY",
"WAY")
terms <- split(terms,rep(1:2,times = length(terms) / 2))
terms[[1]] <- paste0("\\b",terms[[1]],"(\\.|\\b)")
terms[[1]]
# [1] "\\bST(\\.|\\b)" "\\bRD(\\.|\\b)" "\\bAVE(\\.|\\b)" "\\bN(\\.|\\b)" "\\bW(\\.|\\b)" "\\bS(\\.|\\b)" "\\bE(\\.|\\b)"
# [8] "\\bSTE(\\.|\\b)" "\\bHWY(\\.|\\b)" "\\bDR(\\.|\\b)" "\\bNW(\\.|\\b)" "\\bNE(\\.|\\b)" "\\bSW(\\.|\\b)" "\\bSE(\\.|\\b)"
#[15] "\\bLN(\\.|\\b)" "\\bWAY(\\.|\\b)"
terms[[2]]
# [1] "STREET" "ROAD" "AVENUE" "NORTH" "WEST" "SOUTH" "EAST" "SUITE" "HIGHWAY" "DRIVE"
#[11] "NORTH WEST" "NORTH EAST" "SOUTH WEST" "SOUTH EAST" "LANE" "WAY"