问题:
我有一个包含 GPS 坐标的数据框,其中不使用度和分的符号,而是以使用小数点的格式编写,这是不正确的:
我想将所有 GPS 坐标转换为 DMS(度、分、秒),所有坐标都以此格式写入:
27°57'67.9, 33°88'02.7
手动恢复所有 GPS 坐标是相当耗费人力的,因为坐标被写在两个单独的列中,超过 800 行。
我不知道如何进行此转换,我可以使用 R 将度数 (°) 和分 (') 的符号添加到数据框中的所有坐标。
在我的数据框中,一些 GPS 位置是未知的,它们以这种格式写入单元格中:
代码需要识别这些缺失的 GPS 位置。
如果有人可以提供帮助,我将非常感激
“缺失”值的存在需要一些额外的步骤,因为坐标值列当前是字符串,但这是一个潜在的工作流程:
library(dplyr)
library(purrr)
# Function to convert DD to DMS
dd_to_dms <- function(x) {
if (any(is.na(x))) { return(rep(NA, length(x))) }
neg_dd <- x < 0
abs_x <- abs(x)
d <- floor(abs_x)
m <- floor((abs_x - d) * 60)
s <- ((abs_x - d) * 3600) %% 60
dms <- sprintf("%d° %d' %.3f\"", d, m, s)
dms[neg_dd] <- paste0("-", dms[neg_dd])
return(dms)
}
# Example data
set.seed(1)
df <- data.frame(longitude = c("missed", round(runif(5, -180, 180), 5)),
latitude = c("missed", round(runif(5, -90, 90), 5)))
df
# longitude latitude
# 1 missed missed
# 2 -84.41688 71.71014
# 3 -46.0354 80.04155
# 4 26.22721 28.9436
# 5 146.9548 23.24053
# 6 -107.3945 -78.87847
# Convert "missed" to NA and change coordinate columns to numeric
df <- df %>%
mutate(across(c(longitude, latitude), ~ as.numeric(na_if(., "missed"))))
df
# longitude latitude
# 1 NA NA
# 2 -84.41688 71.71014
# 3 -46.03540 80.04155
# 4 26.22721 28.94360
# 5 146.95480 23.24053
# 6 -107.39450 -78.87847
# Convert DD coordinates to DMS using dd_to_dms function
df <- df %>%
mutate(across(c(longitude, latitude), ~ map_chr(as.numeric(.), dd_to_dms)))
df
# longitude latitude
# 1 <NA> <NA>
# 2 -84° 25' 0.768" 71° 42' 36.504"
# 3 -46° 2' 7.440" 80° 2' 29.580"
# 4 26° 13' 37.956" 28° 56' 36.960"
# 5 146° 57' 17.280" 23° 14' 25.908"
# 6 -107° 23' 40.200" -78° 52' 42.492"