R语言新手求助:如何高效匹配两个数据框生成目标数据框?
R语言数据匹配解决方案
先模拟你的三个数据框(方便直接运行演示):
# 1. ID与Distance映射表 id_dist <- data.frame( ID = c("A", "B", "C", "D", "E"), Distance = c(30, 50, 300, 120, 50) ) # 2. 年份-各Distance对应数值表 year_dist_vals <- data.frame( Year = c(2020, 2021, 2022), "30" = c(10, 12, 15), "50" = c(20, 22, 25), "120" = c(30, 32, 35), "300" = c(40, 42, 45) ) # 3. 目标空表(Year+ID) target_df <- expand.grid(Year = c(2020, 2021, 2022), ID = c("A", "B", "C", "D", "E"))
核心操作步骤
不用写复杂的双重循环,用tidyverse包的函数就能轻松搞定:
- 把宽格式的年份数值表转成长格式
把Distance从列名转成单独一列,方便后续匹配:
library(tidyverse) year_dist_long <- year_dist_vals %>% pivot_longer(cols = -Year, names_to = "Distance", values_to = "Value") %>% mutate(Distance = as.numeric(Distance)) # 转成数值型,和ID映射表的Distance类型统一
- 两次关联匹配填充目标表
先给目标表的每个ID匹配对应的Distance,再用Year和Distance匹配对应数值:
result <- target_df %>% left_join(id_dist, by = "ID") %>% left_join(year_dist_long, by = c("Year", "Distance")) %>% select(Year, ID, Value) # 只保留需要的列
- 查看最终结果:
print(result)
说明
- 这个方法比循环高效得多,逻辑清晰,新手容易上手
- 如果实际数据里有缺失值,
left_join会自动填充NA,后续可以用replace_na处理 - 确保Distance列的类型一致(都是数值型或都是字符型),否则会匹配失败
内容的提问来源于stack exchange,提问作者bLanton70
相关产品推荐
相关产品推荐

