R语言新手咨询:带方位字母的经纬度如何转可计算正负十进制值
带方位字母的经纬度格式转换实现
原代码无法运行的核心原因
- 列名索引错误:目标列名是
Latitude (Deg),属于带空格、括号的特殊命名列,R通过$引用这类列时,必须用反引号把特殊字符括起来才能正确匹配;手写的fbdata$Latitude..Deg.和实际列名完全不匹配,根本取不到对应数据。 - 循环逻辑残缺:原循环仅写了南纬方向的判断分支,没有做字符串清洗、数值转换、正负号赋值的完整流程,仅打印原字符串自然得不到可计算的数值结果。
可直接运行的实现方案
方案1:基础R向量化写法(效率更高,适合新手)
不需要安装额外工具包,逐列匹配完成转换:
# 1. 正确引用带特殊字符的原列 raw_coords <- fbdata$`Latitude (Deg)` # 2. 按规则生成正负号标记:匹配到对应方位的就标记为负值 # 按照提出的“南纬、东经为负”的规则,匹配S、E结尾的坐标 sign_mark <- ifelse(grepl("S$|E$", raw_coords), -1, 1) # 3. 移除字符串末尾的方位字母,转成纯数值 clean_num <- as.numeric(gsub("[NSEW]$", "", raw_coords)) # 4. 合并得到最终可计算的数值列,存回原始数据框 fbdata$lat_clean <- sign_mark * clean_num
说明:如果需要换回通用地理坐标的正负规则(南纬、西经为负),只要把
grepl("S$|E$", raw_coords)里的匹配值改成S$|W$即可。
方案2:修正后兼容原有循环逻辑的写法
如果希望顺着最初写循环的思路实现,把原代码的问题修正后即可正常运行:
# 提前在数据框新建空的数值列,用于存储转换结果 fbdata$lat_clean <- NA_real_ # 遍历每一行的索引,避免直接遍历列元素导致的索引错位 for (i in seq_along(fbdata$`Latitude (Deg)`)) { # 取当前行的原始坐标字符串 cur_coord <- fbdata$`Latitude (Deg)`[i] # 移除方位字母转成纯数值 cur_val <- as.numeric(gsub("[NSEW]", "", cur_coord)) # 按规则判断是否加负号 if (endsWith(cur_coord, "S") | endsWith(cur_coord, "E")) { cur_val <- -cur_val } # 把转换结果存入对应行的新列 fbdata$lat_clean[i] <- cur_val }
内容的提问来源于stack exchange,提问作者Tyler Virkler
相关产品推荐
相关产品推荐

