Преобразование значений символов lat / lng в числовые - PullRequest
0 голосов
/ 27 июня 2018

У меня есть фрейм данных, df, с широтными и продольными значениями символов с обозначениями Восток, Запад, Север и Юг. Как можно было бы элегантно преобразовать df в желаемый выходной сигнал df2, преобразовав столбцы Latitude и Longitude в числовые и сделав любое из значений Юга и Запада отрицательным?

#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 
  )

Заранее благодарим за ваши добрые предложения

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Решение с использованием 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 
0 голосов
/ 28 июня 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...