Я хочу разделить адрес улицы на две колонки.один с номером улицы другой с названием улицы - PullRequest
0 голосов
/ 01 июня 2018

У меня есть столбец df $ addr, который я хочу разделить на два столбца: df $ str.num и df $ str.name.некоторые вхождения df $ addr содержат тире, что затрудняет точное извлечение номера улицы (df $ str.num).Я попробовал несколько решений, но не понял это правильно.

есть предложения?

       addr <- c("84-86 19th Ave",
                 "35 Halsey St",
                 "350 Broad St",
                 "997 S Orange Ave",
                 "274 Chestnut St",
                 "226 Lackawanna Ave",
                 "99 2nd Ave",
                 "261 S Orange Ave",
                 "357 Wilson Ave",
                 "402 Mount Prospect Ave # Lb2",
                 "380-2 Mount Prospect Ave",
                 "105 Lock St # 219",
                 "451 S 15th St")
       df <- data.frame(addr)

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Очень похоже на решение MKR - но с использованием stringr

library(stringr)
pat <- "(^[0-9-]+)[:space:]+([A-Za-z0-9].+)"
str_match(addr, pat)
      [,1]                           [,2]    [,3]                      
 [1,] "84-86 19th Ave"               "84-86" "19th Ave"                
 [2,] "35 Halsey St"                 "35"    "Halsey St"               
 [3,] "350 Broad St"                 "350"   "Broad St"                
 [4,] "997 S Orange Ave"             "997"   "S Orange Ave"            
 [5,] "274 Chestnut St"              "274"   "Chestnut St"             
 [6,] "226 Lackawanna Ave"           "226"   "Lackawanna Ave"          
 [7,] "99 2nd Ave"                   "99"    "2nd Ave"                 
 [8,] "261 S Orange Ave"             "261"   "S Orange Ave"            
 [9,] "357 Wilson Ave"               "357"   "Wilson Ave"              
[10,] "402 Mount Prospect Ave # Lb2" "402"   "Mount Prospect Ave # Lb2"
[11,] "380-2 Mount Prospect Ave"     "380-2" "Mount Prospect Ave"      
[12,] "105 Lock St # 219"            "105"   "Lock St # 219"           
[13,] "451 S 15th St"                "451"   "S 15th St" 

Не будучи уверенным, насколько хорошо вы знакомы с регулярным выражением, важно отметить, что круглые скобки () используются для идентификации шаблонов группировкимы хотели бы извлечь.

0 голосов
/ 01 июня 2018

Используя базу R, мы можем сделать это с помощью функции sub:

data.frame(str.num = sub(" .*", "", addr), str.name = sub("[0-9-]* ", "", addr))

#    str.num                 str.name
# 1    84-86                 19th Ave
# 2       35                Halsey St
# 3      350                 Broad St
# 4      997             S Orange Ave
# 5      274              Chestnut St
# 6      226           Lackawanna Ave
# 7       99                  2nd Ave
# 8      261             S Orange Ave
# 9      357               Wilson Ave
# 10     402 Mount Prospect Ave # Lb2
# 11   380-2       Mount Prospect Ave
# 12     105            Lock St # 219
# 13     451                S 15th St
0 голосов
/ 01 июня 2018

Можно использовать tidyr::extract для разделения digit и - в одном столбце как str.num, а остальные как str.name:

library(tidyr)

extract(df, addr, c("str.num", "str.name"), regex = "([[:digit:]-]+)\\s(.*)" )

#    str.num                 str.name
# 1    84-86                 19th Ave
# 2       35                Halsey St
# 3      350                 Broad St
# 4      997             S Orange Ave
# 5      274              Chestnut St
# 6      226           Lackawanna Ave
# 7       99                  2nd Ave
# 8      261             S Orange Ave
# 9      357               Wilson Ave
# 10     402 Mount Prospect Ave # Lb2
# 11   380-2       Mount Prospect Ave
# 12     105            Lock St # 219
# 13     451                S 15th St
...