Извлеките номер дома из строки (адрес) с помощью r


Я хочу разобрать (извлечь) адреса на номера домов и улиц. Позже я смогу записать извлеченные "значения" в новые столбцы (магазины$HouseNumber и магазины$Streetname).

Итак, допустим, у меня есть фрейм данных под названием "магазины":

> shops
      Name                 city        street
 1    Something            Fakecity    New Street 3
 2    SomethingOther       Fakecity    Some-Complicated-Casestreet 1-3
 3    SomethingDifferent   Fakecity    Fake Street 14a

Итак, есть ли способ разделить столбец улиц на два списка, один из которых содержит названия улиц, а другой-номера домов, включая такие случаи, как"1-3"," 14a", чтобы в конечном итоге результат можно было присвоить фрейму данных и выглядит как.

 > shops
      Name                 city        Streetname                    HouseNumber
 1    Something            Fakecity    New Street                    3
 2    SomethingOther       Fakecity    Some-Complicated-Casestreet   1-3
 3    SomethingDifferent   Fakecity    Fake Street                   14a 

Пример: Easyfakestreet 5 --> Easyfakestreet, 5

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

Примеры:
Новая Улица 3 -- > ['Новая Улица', ' 3 ']
Some-Complicated-Casestreet 1-3 -- > ['Some-Complicated-Casestreet', '1-3']
поддельная улица 14а -- > ['поддельная улица', '14а']

Я был бы признателен за помощь!

3 3

3 ответа:

Вот возможное tidyr Решение

library(tidyr)
extract(df, "street", c("Streetname", "HouseNumber"), "(\\D+)(\\d.*)")
#                 Name     city                   Streetname HouseNumber
# 1          Something Fakecity                  New Street            3
# 2     SomethingOther Fakecity Some-Complicated-Casestreet          1-3
# 3 SomethingDifferent Fakecity                 Fake Street          14a

Вы можете попробовать:

shops$Streetname <- gsub("(.+)\\s[^ ]+$","\\1", shops$street)
shops$HousNumber <- gsub(".+\\s([^ ]+)$","\\1", shops$street)

Данные

shops$street
#[1] "New Street 3"                    "Some-Complicated-Casestreet 1-3" "Fake Street 14a" 

Результаты

shops$Streetname
#[1] "New Street"                  "Some-Complicated-Casestreet" "Fake` Street" 

shops$HousNumber
#[1] "3"   "1-3" "14a"

Создайте шаблон с обратными ссылками, которые совпадают как с улицей, так и с номером, а затем с помощью sub замените его на каждую обратную ссылку по очереди. Никакие пакеты не требуются:

pat <- "(.*) (\\d.*)"
transform(shops,
   street = sub(pat, "\\1", street), 
   HouseNumber = sub(pat, "\\2", street)
)

Дача:

                Name     city                      street  HouseNumber
1          Something Fakecity                  New Street            3
2     SomethingOther Fakecity Some-Complicated-Casestreet          1-3
3 SomethingDifferent Fakecity                 Fake Street          14a

Вот визуализация pat:

(.*) (\d.*)

Визуализация регулярных выражений

Debuggex Demo

Примечание:

1) мы использовали это для shops:

shops <-
structure(list(Name = c("Something", "SomethingOther", "SomethingDifferent"
), city = c("Fakecity", "Fakecity", "Fakecity"), street = c("New Street 3", 
"Some-Complicated-Casestreet 1-3", "Fake Street 14a")), .Names = c("Name", 
"city", "street"), class = "data.frame", row.names = c(NA, -3L))

2) картина Давида Arenburg может поочередно использоваться здесь. Просто установите pat на него. Шаблон выше имеет то преимущество, что он позволяет названия улиц, которые имеют встроенные номера в них, но Дэвид имеет то преимущество, что пространство может отсутствовать перед номером улицы.