在R中处理含'Missed'值的DMS转DD GPS坐标转换问题
解决DMS转十进制度坐标并处理缺失值的问题
直接上解决方案:我们可以写一个兼容两种DMS格式(.分隔和°'分隔)的转换函数,自动跳过'Missed'值,再结合dplyr批量处理目标列。
1. 自定义DMS转十进制度函数
这个函数会先判断输入是否为'Missed',是则返回NA;否则解析度、分、秒并计算十进制度:
dms_to_dd <- function(dms_str) { # 处理缺失值 if (dms_str == "Missed" | is.na(dms_str)) { return(NA_real_) } # 统一处理两种分隔符:把°和'替换成.,方便拆分 cleaned_str <- gsub("[°']", ".", dms_str) # 拆分度、分、秒 parts <- as.numeric(strsplit(cleaned_str, "\\.")[[1]]) # 计算十进制度:度 + 分/60 + 秒/3600 dd <- parts[1] + parts[2]/60 + parts[3]/3600 return(dd) }
2. 结合dplyr批量转换并写入新列
在你已有的代码基础上,用mutate调用上面的函数,一次性处理两列:
library(dplyr, warn = FALSE) # 加载你提供的测试数据框 New_Df <- structure(c("33°53'27.0", "33°85'09.3", "33°52'77.1", "33°52'79.0", "33°52'79.0", "33°51'00.", "Missed", "Missed", "33°85'09.3", "Missed", "33°50'14.1", "33°85'09.2", "33°50'20.", "33°80'14.9", "33°50'47.1", "Missed", "33°49'0.0", "33°57'93.8", "33°57'93.9", "Missed", "Missed", "33°49'75.5", "33°48'45.2", "33°85'09.3", "Missed", "33°57'93.8", "33°48'79.3", "33°53'27.", "Missed", "33°52'79.", "27°16'04.0", "27°40'93.2", "27°28'44.", "27°15'85.0", "27°15'85.0", "27°21'40.", "Missed", "Missed", "27°40'93.2", "Missed", "27°13'20.0", "27°40'93.1", "27°20'45.", "27°31'21.4", "27°13'94.9", "Missed", "27°11'44.6", "27°10'85.2", "23°10'85.2", "Missed", "Missed", "27°21'68.0", "27°18'19.0", "27°40'93.2", "Missed", "27°10'85.2", "27°17'79.2", "27°16'04.", "Missed", "27°15'85.", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA ), dim = c(30L, 4L), dimnames = list(NULL, c("Longitude_E_Corrected", "Latitude_N_Corrected", "Decimal_Degrees_Longitude_E", "Decimal_Degrees_Latitude_N" ))) # 执行转换 New_Df <- New_Df |> mutate( Decimal_Degrees_Longitude_E = sapply(Longitude_E_Corrected, dms_to_dd), Decimal_Degrees_Latitude_N = sapply(Latitude_N_Corrected, dms_to_dd) ) # 查看结果 head(New_Df)
关键说明
- 函数自动识别并跳过'Missed'和NA值,不会中断转换流程
- 兼容你提供的两种DMS格式:
33.53.270和33°53'27.0,无需额外预处理 - 转换后的结果直接覆盖你之前创建的空列,无需额外操作
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

