#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)