【问题标题】:Convert character lat/lng values to numeric将字符 lat/lng 值转换为数字
【发布时间】: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,其中一个答案能解决您的问题吗?如果是这样,请不要忘记接受它。 (如果没有,请告诉我们有什么不同...)

标签: r leaflet


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多