Tengo un marco de datos df con un campo de lugar que contiene cadenas que se ve así:

countryName0 / provinceName0 / countyName0 / cityName0
countryName1 / provinceName1

Usando este código, puedo extraer el identificador de lugar de mejor resolución:

df$shortplace <- trimws(basename(df$place))

O:

df$shortplace <- gsub(".*/ ", "", df$place)

E.g.

cityName0
provinceName1

Entonces puedo usar la biblioteca ggmap para extraer códigos geográficos para cityName0 y provinceName1:

df$geo <- geocode(df$shortplace)

El resultado se ve así:

geo.lat   geo.long
-33.789    147.909
-29.333    133.819

Desafortunadamente, algunos nombres de ciudades no son únicos, p. Perth es la capital de Australia Occidental, una ciudad en Tasmania y una ciudad en Escocia. Lo que necesito hacer es extraer no el identificador de lugar después de la última "/" sino la segunda última "/" (y reemplazar la "/" con una "" para proporcionar más información para la función geocode (). Cómo escaneo al penúltimo "/" y extraer los nombres de lugar de orden más alto y de segundo orden más alto?

                shortplace
     countyName0 cityName0
countryName1 provinceName1
r
1
aterhorst 3 mar. 2018 a las 14:44

3 respuestas

La mejor respuesta

Hay otras formas, pero strsplit() me parece la más sencilla aquí. Prueba esto:

x = "countryName0 / provinceName0 / countyName0 / cityName0"
x_split = strsplit(x, " / ")[[1]] # Somewhat confusingly, result of strsplit() is a list; [[1]] pulls out the one and only entry here
n_terms = length(x_split)
result = paste(x_split[n_terms - 1], x_split[n_terms], sep = ", ")
result
# [1] "countyName0, cityName0"
0
Ry Guy 3 mar. 2018 a las 12:03

Una opción es sub para que coincidan los caracteres alfanuméricos seguidos de uno o más espacios, / seguido de espacio (\\s+), luego otro conjunto de caracteres alfanuméricos hasta el final de la cadena ($), capturar como grupo y reemplazar con las referencias posteriores (\\1 \\2) de los grupos de captura

df$shortplace <- sub(".*\\b([[:alnum:]]+)\\s+\\/\\s+([[:alnum:]]+)$", "\\1 \\2", df$place)
df$shortplace
#[1] "countyName0 cityName0"      "countryName1 provinceName1"
0
akrun 3 mar. 2018 a las 12:04

Esto funcionó para mí al final:

df$shortplace <- gsub("((?:/[^/\r\n]*){2})$", "\1", df$place)
df$shortplace <- gsub("\\ / ", ", ", df$place)

No es súper elegante pero hace el trabajo.

0
aterhorst 4 mar. 2018 a las 02:59