在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
相关产品推荐
相关产品推荐

