You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中优雅实现从字典查找并赋值的方法

优雅更新经纬度的解决方案

基础R实现

利用match()函数建立索引,批量替换匹配机场的经纬度值,彻底避免硬编码和重复代码:

# 更新起点数据框
origin_idx <- match(taxi_origins$ORIGINCITY, airports$airport)
taxi_origins$ORIGIN_BLOCK_LATITUDE[!is.na(origin_idx)] <- airports$lat[origin_idx[!is.na(origin_idx)]]
taxi_origins$ORIGIN_BLOCK_LONGITUDE[!is.na(origin_idx)] <- airports$long[origin_idx[!is.na(origin_idx)]]

# 更新终点数据框
dest_idx <- match(taxi_destinations$DESTINATIONCITY, airports$airport)
taxi_destinations$DESTINATION_BLOCK_LAT[!is.na(dest_idx)] <- airports$lat[dest_idx[!is.na(dest_idx)]]
taxi_destinations$DESTINATION_BLOCK_LONG[!is.na(dest_idx)] <- airports$long[dest_idx[!is.na(dest_idx)]]

说明:

  • match()返回每个城市代码在机场列表中的位置,无匹配则返回NA
  • 仅对匹配到机场的行替换经纬度,非机场记录的原始值保持不变
  • 后续新增机场时,只需更新airports数据框,无需修改替换逻辑

dplyr实现

通过left_join()关联机场数据,再用coalesce()批量替换经纬度,代码简洁且逻辑连贯:

library(dplyr)

# 更新起点数据框
taxi_origins <- taxi_origins %>%
  left_join(airports, by = c("ORIGINCITY" = "airport")) %>%
  mutate(
    ORIGIN_BLOCK_LATITUDE = coalesce(lat, ORIGIN_BLOCK_LATITUDE),
    ORIGIN_BLOCK_LONGITUDE = coalesce(long, ORIGIN_BLOCK_LONGITUDE)
  ) %>%
  select(-lat, -long, -taz) # 移除临时关联的冗余列

# 更新终点数据框
taxi_destinations <- taxi_destinations %>%
  left_join(airports, by = c("DESTINATIONCITY" = "airport")) %>%
  mutate(
    DESTINATION_BLOCK_LAT = coalesce(lat, DESTINATION_BLOCK_LAT),
    DESTINATION_BLOCK_LONG = coalesce(long, DESTINATION_BLOCK_LONG)
  ) %>%
  select(-lat, -long, -taz)

说明:

  • left_join()保留原始数据的所有行,仅匹配到机场的行会新增经纬度列
  • coalesce()优先使用机场数据中的经纬度,无匹配则保留原始值
  • 链式调用让处理流程一目了然,适合高效处理大型数据框

内容的提问来源于stack exchange,提问作者sonicseamus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:42:51