【问题标题】:Split street address into street number and street name in r将街道地址拆分为r中的街道号和街道名称
【发布时间】:2014-04-10 12:14:09
【问题描述】:

我想在 r 中将街道地址拆分为街道名称和街道编号。

我的输入数据有一列,例如

    Street.Addresses

    205 Cape Road
    32 Albany Street 
    cnr Kempston/Durban Roads

我想将街道号码和街道名称分成两个单独的列,以便显示为:

    Street Number    Street Name
    205              Cape Road
    32               Albany Street
                     cnr Kempston/Durban Roads

是否可以将数值从 R 中的因子/字符串中的非数字条目中拆分出来?

谢谢

【问题讨论】:

  • 你试过了吗:sub、gsub 和 strsplit?

标签: r street-address stringr


【解决方案1】:

你可以试试:

y <- lapply(strsplit(x, "(?<=\\d)\\b ", perl=T), function(x) if (length(x)<2) c("", x) else x)
y <- do.call(rbind, y)
colnames(y) <- c("Street Number", "Street Name")

【讨论】:

    【解决方案2】:

    我确信有人会提出一个很酷的正则表达式解决方案,包括前瞻等等,但这可能对你有用:

    X <- c("205 Cape Road", "32 Albany Street", "cnr Kempston/Durban Roads")
    nonum <- grepl("^[^0-9]", X)
    X[nonum] <- paste0(" \t", X[nonum])
    X[!nonum] <- gsub("(^[0-9]+ )(.*)", "\\1\t\\2", X[!nonum])
    read.delim(text = X, header = FALSE)
    #    V1                        V2
    # 1 205                 Cape Road
    # 2  32             Albany Street
    # 3  NA cnr Kempston/Durban Roads
    

    【讨论】:

    • 或者简单地说:X &lt;- gsub("^([0-9]+ +)?(.*)", "\\1\t\\2", X)
    【解决方案3】:

    这是另一种方式:

    df <- data.frame (Street.Addresses = c ("205 Cape Road", "32 Albany Street", "cnr Kempston/Durban Roads"),
                     stringsAsFactors = F)
    
    new_df <- data.frame ("Street.Number" = character(), 
                         "Street.Name" = character(), 
                         stringsAsFactors = F)
    for (i in 1:nrow (df)) {
    
      new_df [i,"Street.Number"] <- unlist(strsplit (df[["Street.Addresses"]], " ")[i])[1]
      new_df [i,"Street.Name"] <- paste (unlist(strsplit (df[["Street.Addresses"]], " ")[i])[-1], collapse = " ")
    
    }
    
    > new_df
      Street.Number           Street.Name
    1           205             Cape Road
    2            32         Albany Street
    3           cnr Kempston/Durban Roads
    

    【讨论】:

    • 不适用于第三个地址“cnr”是街道名称的一部分
    • 哦……我的错。我以不同的方式理解它。现在你的回答很有意义......我将删除我的版本。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多