После Strsplit вывод не в ожидаемом формате
Мой входной файл с именем "locaddr" имеет следующие записи:
"Shelbourne Road, Dublin, Ireland"
"1 Hatch Street Upper, Dublin, Ireland"
"98 Haddington Road, Dublin, Ireland"
"11 Mount Argus Close, Harold's Cross, Dublin 6W, Co. Dublin, Ireland"
"Winterstraße 17, 69190 Walldorf, Germany"
Я применил функцию STRSPLIT в R к этому файлу, используя следующий код:
*testmat <- strsplit(locaddr,split=",")
outmat <- matrix(unlist(testmat), nrow=nrow(locaddr), ncol=3, byrow=T)*
Окончательный результат, который я получаю:
Street City Country
[1,] "Shelbourne Road" " Dublin" " Ireland"
[2,] "1 Hatch Street Upper" " Dublin" " Ireland"
[3,] "98 Haddington Road" " Dublin" " Ireland"
[4,] "11 Mount Argus Close" " Harold's Cross" " Dublin 6W"
[5,] " Co. Dublin" " Ireland" "Winterstraße 17"
[6,] " 69190 Walldorf" " Germany" "Caughley Road"
[7,] " Broseley" " Shropshire TF12 5AT" " UK"
[8,] "Pappelweg 30" " 48499 Salzbergen" " Germany"
[9,] "60 Grand Canal Street Upper" " Dublin 4" " Ireland"
[10,] "Wieslocher Straße" " 68789 Sankt Leon-Rot" " Germany"
Как видно из вышесказанного, требуемым результатом были три заключительных члена в каждой записи. Но вместо этого у меня есть смесь почти всего там.
Мое требование состоит в том, что, хотя все адреса имеют переменную длину, после STRSPLIT мне нужно выбрать только последние три условия и указать их как Улица, Город Страна.
Ваша помощь и время очень ценятся.
2 ответа
В следующий раз, пожалуйста, предоставьте свой вопрос с некоторым удобным воспроизводимым кодом.
Ниже приведен код того, как я бы попытался решить эту проблему.
x <- c("Shelbourne Road, Dublin, Ireland",
"1 Hatch Street Upper, Dublin, Ireland",
"98 Haddington Road, Dublin, Ireland",
"11 Mount Argus Close, Harold's Cross, Dublin 6W, Co. Dublin, Ireland",
"Winterstraße 17, 69190 Walldorf, Germany")
# split on ,
splitx <- strsplit(x, ",")
# for every list element (lapply climbs the list element-wise)
# subset last 3 elements
last3 <- lapply(splitx, tail, n = 3)
# merge them together by row
do.call("rbind", last3)
[,1] [,2] [,3]
[1,] "Shelbourne Road" " Dublin" " Ireland"
[2,] "1 Hatch Street Upper" " Dublin" " Ireland"
[3,] "98 Haddington Road" " Dublin" " Ireland"
[4,] " Dublin 6W" " Co. Dublin" " Ireland"
[5,] "Winterstraße 17" " 69190 Walldorf" " Germany"
По сути, это вариант ответа Романа, но он предназначен для объединения (потенциально) нескольких адресов. Предполагается, что двумя последними значениями, разделенными запятыми, являются город и страна, а затем объединяются предыдущие элементы.
# read data
y <- c("Shelbourne Road, Dublin, Ireland",
"1 Hatch Street Upper, Dublin, Ireland",
"98 Haddington Road, Dublin, Ireland",
"11 Mount Argus Close, Harold's Cross, Dublin 6W, Co. Dublin, Ireland",
"Winterstraße 17, 69190 Walldorf, Germany")
# split and output
result <- lapply(y, function(x) {
splitx <- strsplit(x, ", ")[[1]]
rowtail <- tail(splitx, n = 2)
if(length(splitx)>3)
multi <- paste(splitx[1:(length(splitx)-2)],collapse=", ")
else
multi <- splitx[1]
return(c(multi,rowtail))
})
# rbind back together
do.call(rbind,result)
Это производит:
[,1] [,2] [,3]
[1,] "Shelbourne Road" "Dublin" "Ireland"
[2,] "1 Hatch Street Upper" "Dublin" "Ireland"
[3,] "98 Haddington Road" "Dublin" "Ireland"
[4,] "11 Mount Argus Close, Harold's Cross, Dublin 6W" "Co. Dublin" "Ireland"
[5,] "Winterstraße 17" "69190 Walldorf" "Germany"