如何在R中将Degree minute sec转换为Decimal?

时间:2015-06-16 22:35:34

标签: regex r

我有这个数据框:

Lat        Long
59 44 50   151 45 11
59 49 28   154 52 56
59 46 42   150 45 15

如何将其转换为十进制列?

lat是dd mm ss,long是ddd mm ss

我在这里找到了类似的解决方案,但无法根据我的情况调整正则表达式。

Converting geo coordinates from degree to decimal

3 个答案:

答案 0 :(得分:5)

尝试此功能:

angle2dec <- function(angle) {
  angle <- as.character(angle)
  x <- do.call(rbind, strsplit(angle, split=' '))
  x <- apply(x, 1L, function(y) {
    y <- as.numeric(y)
    y[1] + y[2]/60 + y[3]/3600
  })
  return(x)
}

然后,您可以将其应用于数据框中的每一列:

new_df <- apply(df, 2L, angle2dec)
new_df
          Lat     Long
[1,] 59.74722 151.7531
[2,] 59.82444 154.8822
[3,] 59.77833 150.7542

或只是

df$Lat <- angle2dec(df$Lat)
df$Long <- angle2dec(df$Long)

答案 1 :(得分:1)

我建议使用tidyr方法:

df <- data.frame( Lat=c("59 44 50","59 49 28","59 46 42"),
                 Long=c("151 45 11","154 52 56","150 45 15"))

library(tidyr); library(dplyr)
df %>% 
  separate(Lat, paste("lat",c("d","m","s"), sep="_") ) %>%
  separate(Long, paste("long",c("d","m","s"), sep="_" ) ) %>%
  mutate_each(funs(as.numeric)) %>%
  transmute(lat_dec=lat_d + lat_m/60 + lat_s/60^2,
            long_dec=long_d + long_m/60 + long_s/60^2)

#    lat_dec long_dec
# 1 59.74722 151.7531
# 2 59.82444 154.8822
# 3 59.77833 150.7542

答案 2 :(得分:1)

以下是使用splitstackshape

的想法
library(dplyr)
library(splitstackshape)

df %>% 
  cSplit(c("Lat", "Long"), sep = " ") %>%
  transmute(Lat = Lat_1 + Lat_2 / 60 + Lat_3 / 60^2,
            Long = Long_1 + Long_2 / 60 + Long_3 / 60^2)

给出了:

#        Lat     Long
#1: 59.74722 151.7531
#2: 59.82444 154.8822
#3: 59.77833 150.7542