我有一个数据框df,其中包含一个包含字符串的地方字段,如下所示:
countryName0 / provinceName0 / countyName0 / cityName0
countryName1 / provinceName1
使用此代码,我可以提取最好的分辨率地点标识符:
df$shortplace <- trimws(basename(df$place))
要么:
df$shortplace <- gsub(".*/ ", "", df$place)
EG
cityName0
provinceName1
然后我可以使用ggmap库来提取cityName0和provinceName1的地理编码:
df$geo <- geocode(df$shortplace)
结果如下所示:
geo.lat geo.long
-33.789 147.909
-29.333 133.819
不幸的是,一些城市名称不是唯一的,例珀斯是西澳大利亚州的首府,是塔斯马尼亚的一个小镇,也是苏格兰的一个城市。我需要做的是在最后一个“/”之后不提取地点标识符,而在最后一个“/”之后提取地址标识符(并用“”替换“/”以提供geocode()函数的更多信息。我如何扫描到倒数第二个“/”并提取最高和第二高位地名?例如
shortplace
countyName0 cityName0
countryName1 provinceName1
还有其他方法,但strsplit()
对我来说似乎最直接。尝试一下:
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"
一个选项是sub
匹配字母数字字符后跟一个或多个空格,/
后跟空格(\\s+
),然后是另一组字母数字字符,直到字符串结尾($
),作为一组捕获并替换为捕获组的反向引用(\\1 \\2
)
df$shortplace <- sub(".*\\b([[:alnum:]]+)\\s+\\/\\s+([[:alnum:]]+)$", "\\1 \\2", df$place)
df$shortplace
#[1] "countyName0 cityName0" "countryName1 provinceName1"
这最终对我有用:
df$shortplace <- gsub("((?:/[^/\r\n]*){2})$", "\1", df$place)
df$shortplace <- gsub("\\ / ", ", ", df$place)
不是超级优雅,但它做的工作。