Используйте R и регулярное выражение, чтобы сохранить только нужную запятую в адресной строке

#r #regex

#r #регулярное выражение

Вопрос:

Я хотел бы разделить список адресных строк на два столбца, разделив между городом и штатом.

Например, скажем, у меня есть две адресные строки:

addr1 <- «123 ABC street Lot 10, Fairfax, VA 22033»

addr2 <- «123 ABC street Fairfax, VA 22033»

Как бы я использовал regex в R, чтобы удалить «неожиданную» запятую между Lot 10 и Fairfax, чтобы в любой заданной адресной строке оставалась единственная запятая, разделяющая город и штат?

Мой желаемый результат — это фрейм данных, в котором адресная строка разделена на два столбца по вышеупомянутой запятой:

введите описание изображения здесь

Ответ №1:

Есть два способа расширить ответ Тима:

  • Zip 4 почтовых индекса (только для США?); и
  • «состояние» не из двух букв … на самом деле, просто ищу границу слова вместо жестко запрограммированных «2 букв» (не уверен, имеет ли это значение / когда… кто-нибудь пишет не двухбуквенное состояние?)
 addresses <- c("123 ABC street Lot 10, Fairfax, VA 22033", "123 ABC street Fairfax, VA 22033")

sub("\b[[:alpha:]] \s [[:digit:]]{5}(-[[:digit:]]{4})?$", "", addresses)
# [1] "123 ABC street Lot 10, Fairfax, " "123 ABC street Fairfax, "        
sub(".*(\b[[:alpha:]] \s [[:digit:]]{5}(-[[:digit:]]{4})?$)", "\1", addresses)
# [1] "VA 22033" "VA 22033"
  

Мы можем удалить запятые ( gsub(",","",...) ) и обрезать пробелы ( trimws(...) ) отдельно.

 out <- data.frame(
  X1 = sub("\b[[:alpha:]] \s [[:digit:]]{5}(-[[:digit:]]{4})?$", "", addresses),
  X2 = sub(".*(\b[[:alpha:]] \s [[:digit:]]{5}(-[[:digit:]]{4})?$)", "\1", addresses)
)
out[] <- lapply(out, function(x) trimws(gsub(",", "", x)))
out
#                              X1       X2
# 1 123 ABC street Lot 10 Fairfax VA 22033
# 2        123 ABC street Fairfax VA 22033
  

(Хотя можно привести доводы в пользу более тщательного удаления запятых. пожатие плечами)

Комментарии:

1. Забавная история: Однажды я жил в месте, где в нашем доме был физический 4-значный почтовый ящик. Хороший ответ, в противном случае 1.

Ответ №2:

Предполагая, что вы просто хотите разделить адрес до конечного состояния и почтового индекса, вы можете использовать sub следующим образом:

 df$X1 <- sub(", [A-Z]{2} \d{5}$", "", df$address)
df$X2 <- sub("^.*([A-Z]{2} \d{5})$", "\1", df$address)
df

                              X1       X2
1 123 ABC street Lot 10, Fairfax VA 22033
2         123 ABC street Fairfax VA 22033
  

Данные:

 df <- data.frame(address=c("123 ABC street Lot 10, Fairfax, VA 22033",
                           "123 ABC street Fairfax, VA 22033"), stringsAsFactors=FALSE)