Search code examples
rcoordinateslatitude-longitude

Converting coordinate entries from East and West to positive and negative


I currently have a data set listed as

Latitude     Longitude
lat:51.40    long:2.19W
lat:50.52    long:1.09E
lat:57.54    long:3.06W

How do I remove the W and E and make the W reading a negative in Rstudio?

after running dput(head(df)) as comment below suggested (the first few entries in the data set are errors so lat and long values were recorded as 0).

structure(list(latitude = c(" deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 0", " deg_latitude: 56.3600006103516", " deg_latitude: 56.3400001525879"), longitude = c(" deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 0.0", " deg_longitude: 3.38000011444092W", " deg_longitude: 3.36999988555908W")), row.names = c(NA, 20L), class = "data.frame")


Solution

  • Remove all characters that is not digits and punctuation, and if "W" is detected (str_detect()) turn the value to negative

    library(tidyverse) 
    
    df %>%
      mutate(across(
        everything(),
        ~ case_when(
          str_detect(., "W") ~ as.numeric(str_remove_all(., "[^0-9\\.]")) * -1,
          TRUE ~ as.numeric(str_remove_all(., "[^0-9\\.]"))
        )
      ))
    
    # A tibble: 3 × 2
      Latitude Longitude
         <dbl>     <dbl>
    1     51.4     -2.19
    2     50.5      1.09
    3     57.5     -3.06
    

    EDIT:

    df %>%
      mutate(across(
        everything(),
        ~ case_when(
          str_detect(., "W") ~ str_c("-", str_remove_all(., "[^0-9\\.]")),
          TRUE ~ str_remove_all(., "[^0-9\\.]"
        )
      )))