将字符 lat/lng 值转换为数字

Posted

技术标签:

【中文标题】将字符 lat/lng 值转换为数字【英文标题】:Convert character lat/lng values to numeric 【发布时间】:2018-06-27 20:49:03 【问题描述】:

我有一个数据框df,其中包含带有东、西、北和南名称的纬度和经度字符值。将LatitudeLongitude 列转换为数字并将任何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 的解决方案。我们可以将LongitudeLongitude 列分隔为数字和字母,如果是“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.433.08 完整显示?!? (显然与您或您的代码无关) @thelatemail 我认为这是tibble 的默认打印设置。这令人困惑。我从来没有想过为什么它是这样设计的。也许我应该研究一下。 我只是在回想我的一位老主管,如果我不打算持续报告价值,我建议我把报告扔进垃圾箱。哈哈! @thelatemail 我同意你以前的主管的观点,即一致性很重要。有时我在管道操作的最后一步添加as.data.frame() 以获得一致的视图。说到这一点,我想知道 r2evans 如何在他的回答中始终如一地打印tibble

以上是关于将字符 lat/lng 值转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

解码 lat lng 值

php 处理数组

php 处理数组

微信原始坐标转换成百度坐标 lat lng

php 处理数组

PHP地理位置计算