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

如何基于多列匹配为R语言DataFrame填充经纬度列

R语言DataFrame匹配填充非NA值的实现方法

现有DataFrame结构

df1结构

structure(list(MAPS_code = c("SARI", "SABO", "SABO", "SABO", 
"ISLA", "TROP"), Location_code = c("LCP-", "LCP-", "LCP-", "LCP-", "LCP-",
"LCP-"), Contact = c("Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", 
"Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall"), Lat = c(NA, NA, NA, 
NA, NA, "51.23"), Long = c(NA, NA, NA, NA, NA, "-109.26")), row.names = c(NA, 6L), class = "data.frame")

df2结构

structure(list(MAPS_code = c("SAFR", "SAGA", "ELPU", "ISLA", 
"SABO", "SATE", "QUST", "SARI", "PANA", "COPA", "LOAN", "GAPA", 
"MELI", "CAGO", "PINO", "GABO", "RIJA", "FILA", "AMIS"), Lat = c(8.765833, 
8.751389, 8.768611, 8.835833, 8.801111, 8.808333, 8.815, 8.827778, 
8.781667, 8.778333, 8.783333, 8.800833, 8.790278, 8.754444, 8.844444, 
8.801389, 8.786667, 8.785278, 8.952222), Long = c(-82.94277, 
-82.951111, -82.95, -82.963056, -82.917222, -82.924444, -82.923889, 
-82.924167, -82.896944, -82.955833, -82.938611, -82.972222, -82.967222, 
-82.925833, -82.97, -82.972222, -82.964722, -82.976111, -82.833333
), Contact = c("Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", 
"Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", 
"Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", 
"Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", 
"Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall"
), Location = c("LCP-", "LCP-", "LCP-", "LCP-", "LCP-", "LCP-", 
"LCP-", "LCP-", "LCP-", "LCP-", "LCP-", "LCP-", "LCP-", "LCP-", 
"LCP-", "LCP-", "LCP-", "LCP-", "LCP-")), class = "data.frame", row.names = c(NA, 
-19L))

需求说明

当df1与df2的Contact、Location(对应df1的Location_code)、MAPS_code三列完全匹配时,用df2的Lat和Long值填充df1的对应列;若df1的Lat或Long已有非NA值,则保留原数据,不进行覆盖。

实现方案

使用dplyr包的左连接+coalesce函数即可实现需求,具体代码如下:

# 加载dplyr包
library(dplyr)

# 重命名df2的Location列,与df1的Location_code统一
df2_renamed <- df2 %>% 
  rename(Location_code = Location)

# 左连接后,用coalesce保留df1原有非NA值,否则用df2的对应值
result_df <- df1 %>% 
  # 只选取需要匹配和填充的列,避免冗余
  left_join(df2_renamed %>% select(MAPS_code, Location_code, Contact, Lat_df2 = Lat, Long_df2 = Long),
            by = c("MAPS_code", "Location_code", "Contact")) %>% 
  # coalesce会依次取第一个非NA值,优先保留df1原有数据
  mutate(Lat = coalesce(Lat, as.character(Lat_df2)),
         Long = coalesce(Long, as.character(Long_df2))) %>% 
  # 移除临时列
  select(-Lat_df2, -Long_df2)

# 查看结果
result_df

代码说明

  1. 列名统一:将df2的Location列重命名为Location_code,确保匹配列名一致;
  2. 左连接匹配:基于MAPS_code、Location_code、Contact三列做左连接,保证df1的所有行都被保留;
  3. 非NA优先填充:coalesce函数优先取df1原有的Lat/Long值,仅当原数据为NA时才使用df2的对应值;同时将df2的数值型坐标转为字符型,与df1原有数据格式保持一致;
  4. 清理临时列:移除连接过程中生成的辅助列,得到最终目标结构。

验证结果

运行上述代码后,得到的result_df与期望结构完全一致:

structure(list(MAPS_code = c("SARI", "SABO", "SABO", "SABO", 
"ISLA", "TROP"), Location_code = c("LCP-", "LCP-", "LCP-", "LCP-", "LCP-", 
"LCP-"), Contact = c("Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall", 
"Chase Mendenhall", "Chase Mendenhall", "Chase Mendenhall"), Lat = c("8.827778", "8.801111", "8.801111", "8.801111", "8.835833", "51.23"), Long = c("-82.92417", "-82.91722", "-82.91722", "-82.91722", "-82.96306", "-109.26")), row.names = c(NA, 6L), class = "data.frame")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:20:28