Как извлечь число, включая весь текст перед числом, из строки - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть список адресов, содержащий (1) номер дома и (2) название здания.Я хочу разделить строки на две колонки.Сложная часть - некоторые номера домов содержат символы, например, «221B Baker Street».

Пример ниже:

add <- c("5 Ark Royal House" , 
     "22A Blington Garden Lincoln Street", 
     "Flat 19 PICTON HOUSE" , 
     "2-3 Royal Albert Court" , 
     "Room 1 Grand Hall", 
     "No 17 The Dell Alpha House")

Идеальные результаты выглядят так:

aim <- data.frame("No"=as.character(c("5", "22A", "Flat 19", "2-3", "Room 1", "No 17")), 
              "Building" = as.character(c("Ark Royal House", 
                                          "Blington Garden Lincoln Street" , 
                                          "PICTON HOUSE", 
                                          "Royal Albert Court" , 
                                          "Grand Hall" , 
                                          "The Dell Alpha House")))

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Базовый подход, находит промежуток между числом и именем, заменяет его, мы надеемся, нейтральным символом (в данном случае _, но это может быть все, что, как вы знаете, не указано ни в одном адресе), затем разделяется наэтот символ.

Предполагается, что последнее «слово», содержащее число, является концом компонента «Нет».Если это не верно для всех ваших адресов (это для всех ваших тестовых случаев), это не сработает.

add <- c("5 Ark Royal House" , 
  "22A Blington Garden Lincoln Street", 
  "Flat 19 PICTON HOUSE" , 
  "2-3 Royal Albert Court" , 
  "Room 1 Grand Hall", 
  "No 17 The Dell Alpha House")

split_add <- strsplit(gsub('([0-9\\-]+[0-9A-z]*) ', '\\1_', add), split='_')

aim <- setNames(as.data.frame(do.call(rbind, split_add)),
  c('No', 'Building'))

aim
#>        No                       Building
#> 1       5                Ark Royal House
#> 2     22A Blington Garden Lincoln Street
#> 3 Flat 19                   PICTON HOUSE
#> 4     2-3             Royal Albert Court
#> 5  Room 1                     Grand Hall
#> 6   No 17           The Dell Alpha House

Создано в 2019-02-19 с помощью пакета представ. (v0.2.1)

0 голосов
/ 19 февраля 2019

Используя stringr:

library(stringr)
lst <- str_match_all(add, "^(\\D*\\d[-\\w]*)\\s+(.+)")

(aim <- setNames(as.data.frame(do.call(rbind, lst)),
                c("all", "No", "Building")))

Или в ванили R:

pattern <- "^(\\D*\\d[-\\w]*)\\s+(.+)"
lst <- regmatches(add, regexec(pattern, add, perl = T))
(aim <- setNames(as.data.frame(do.call(rbind, lst)),
                 c("all", "No", "Building")))


Оба приведут к
                                 all      No                       Building
1                  5 Ark Royal House       5                Ark Royal House
2 22A Blington Garden Lincoln Street     22A Blington Garden Lincoln Street
3               Flat 19 PICTON HOUSE Flat 19                   PICTON HOUSE
4             2-3 Royal Albert Court     2-3             Royal Albert Court
5                  Room 1 Grand Hall  Room 1                     Grand Hall
6         No 17 The Dell Alpha House   No 17           The Dell Alpha House

См. демо для выражения на regex101.com.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...