Извлеките номер дома из строки (адрес) с помощью 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 ответа:
Вот возможное
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.*)
Примечание:
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
на него. Шаблон выше имеет то преимущество, что он позволяет названия улиц, которые имеют встроенные номера в них, но Дэвид имеет то преимущество, что пространство может отсутствовать перед номером улицы.