R, stringr - заменить несколько символов из строк в кадре - PullRequest
1 голос
/ 22 апреля 2020

У меня есть адреса, хранящиеся в столбце «address» в кадре данных магазина. Я хотел бы создать новый столбец со следующими исправлениями для существующих адресов:

{"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"}

Как мне двигаться дальше?

Ожидаемый выход:

101 ST LN -> 101 STREET LANE

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Это должно работать, с str_replace_all из пакета stringr:

df <- data.frame(address = c("12 ST W", "333 AVE", "45 RD", "666 STE E"))

str_replace_all(df$address,c("\\bST\\b" = "STREET",
                             "\\bRD\\b" = "ROAD",
                             "\\bAVE\\b" = "AVENUE",
                             "\\bN\\b" = "NORTH",
                             "\\bW\\b" = "WEST",
                             "\\bE\\b" = "EAST",
                             "\\bSTE\\b" = "SUITE"))
[1] "12 STREET WEST" "333 AVENUE"     "45 ROAD"        "666 SUITE EAST"
1 голос
/ 22 апреля 2020

Один из подходов к этой проблеме - использовать 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"  
...