将字符 lat/lng 值转换为数字
Posted
技术标签:
【中文标题】将字符 lat/lng 值转换为数字【英文标题】:Convert character lat/lng values to numeric 【发布时间】:2018-06-27 20:49:03 【问题描述】:我有一个数据框df
,其中包含带有东、西、北和南名称的纬度和经度字符值。将Latitude
和Longitude
列转换为数字并将任何South 和West 值设为负值,将df
转换为所需输出df2
的优雅方法是什么?
#MRE
library(tibble)
#input data set
df <- tribble(
~Country, ~Capital, ~Latitude, ~Longitude,
"Afghanistan", "Kabul", "34.28N", "69.11E",
"Albania", "Tirane", "41.18N", "19.49E",
"Algeria", "Algiers", "36.42N", "03.08E",
"American Samoa", "Pago Pago", "14.16S", "170.43W",
"Andorra", "Andorra la Vella", "42.31N", "01.32E",
"Angola", "Luanda", "08.50S", "13.15E"
)
# desired output
df2 <- tribble(
~Country, ~Capital, ~Latitude, ~Longitude,
"Afghanistan", "Kabul", 34.28, 69.11,
"Albania", "Tirane", 41.18, 19.49,
"Algeria", "Algiers", 36.42, 03.08,
"American Samoa", "Pago Pago", -14.16, -170.43,
"Andorra", "Andorra la Vella", 42.31, 01.32,
"Angola", "Luanda", -08.50, -13.15
)
提前感谢您的友好建议
【问题讨论】:
heyydrien,其中一个答案能解决您的问题吗?如果是这样,请不要忘记接受它。 (如果没有,请告诉我们有什么不同...) 【参考方案1】:library(dplyr)
df %>%
mutate_at(vars(Latitude, Longitude),
funs(as.numeric(gsub("[NE]$", "", gsub("^(.*)[WS]$", "-\\1", .)))))
# # A tibble: 6 × 4
# Country Capital Latitude Longitude
# <chr> <chr> <dbl> <dbl>
# 1 Afghanistan Kabul 34.28 69.11
# 2 Albania Tirane 41.18 19.49
# 3 Algeria Algiers 36.42 3.08
# 4 American Samoa Pago Pago -14.16 -170.43
# 5 Andorra Andorra la Vella 42.31 1.32
# 6 Angola Luanda -8.50 13.15
【讨论】:
【参考方案2】:使用tidyverse
的解决方案。我们可以将Longitude
和Longitude
列分隔为数字和字母,如果是“S”或“W”,则添加减号。
library(tidyverse)
df2 <- df %>%
separate(Latitude, into = c("Latitude", "Lat_Direction"),
sep = "(?=[A-Za-z])", convert = TRUE) %>%
separate(Longitude, into = c("Longitude", "Long_Direction"),
sep = "(?=[A-Za-z])", convert = TRUE) %>%
mutate(Latitude = ifelse(Lat_Direction %in% "S", -Latitude, Latitude),
Longitude = ifelse(Long_Direction %in% "W", -Longitude, Longitude)) %>%
select(-ends_with("_Direction"))
df2
# # A tibble: 6 x 4
# Country Capital Latitude Longitude
# <chr> <chr> <dbl> <dbl>
# 1 Afghanistan Kabul 34.3 69.1
# 2 Albania Tirane 41.2 19.5
# 3 Algeria Algiers 36.4 3.08
# 4 American Samoa Pago Pago -14.2 -170.
# 5 Andorra Andorra la Vella 42.3 1.32
# 6 Angola Luanda -8.5 13.2
【讨论】:
不错的解决方案,但tibble
的输出格式似乎真的令人困惑:-170.
代表-170.43
而3.08
完整显示?!? (显然与您或您的代码无关)
@thelatemail 我认为这是tibble
的默认打印设置。这令人困惑。我从来没有想过为什么它是这样设计的。也许我应该研究一下。
我只是在回想我的一位老主管,如果我不打算持续报告价值,我建议我把报告扔进垃圾箱。哈哈!
@thelatemail 我同意你以前的主管的观点,即一致性很重要。有时我在管道操作的最后一步添加as.data.frame()
以获得一致的视图。说到这一点,我想知道 r2evans 如何在他的回答中始终如一地打印tibble
?以上是关于将字符 lat/lng 值转换为数字的主要内容,如果未能解决你的问题,请参考以下文章