【问题标题】:I want to split street address into two columns. one with street number other with street name我想将街道地址分成两列。一个带有街道编号 另一个带有街道名称
【发布时间】:2018-06-01 15:21:46
【问题描述】:

我有一列 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)

【问题讨论】:

  • 预期输出是什么?
  • 欢迎来到 Stack Overflow!欢迎来到 Stackoverflow.com!请让您的问题成为最小、完整和可验证的示例MVCE。还要检查how to ask question 以使您的帖子可以回答。

标签: r split


【解决方案1】:

一种选择是使用tidyr::extractdigit- 在一个列中分隔为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

【讨论】:

    【解决方案2】:

    与 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" 
    

    在不确定您对正则表达式的熟悉程度的情况下,请务必注意括号 () 用于标识我们要提取的分组模式。

    【讨论】:

      【解决方案3】:

      使用基础 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        相关资源
        最近更新 更多