Разделите почтовый адрес на номер и название улицы в r

Я хочу разделить почтовый адрес на название и номер улицы в 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?

Спасибо


person Carmen    schedule 10.04.2014    source источник
comment
Вы пробовали: sub, gsub и strsplit?   -  person FFI    schedule 10.04.2014


Ответы (3)


ты можешь попробовать:

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

hth

person droopy    schedule 10.04.2014

Я уверен, что кто-то собирается предложить классное решение для регулярных выражений с опережением просмотра и т. Д., Но это может сработать для вас:

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
person A5C1D2H2I1M1N2O1R2T1    schedule 10.04.2014
comment
Или просто: X <- gsub("^([0-9]+ +)?(.*)", "\\1\t\\2", X) - person krlmlr; 10.04.2014

Вот еще один способ:

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
person Andriy T.    schedule 10.04.2014
comment
это не работает для 3-го адреса cnr является частью названия улицы - person droopy; 10.04.2014
comment
О ... моя ошибка. Я понял это по-другому. Теперь ваш ответ имеет смысл ... Я удалю свою версию. Извините - person Andriy T.; 10.04.2014