基于tidyverse实现优先保留指定数据框ID的DataFrame关联方案
问题描述
现有两个DataFrame:
towns.df:存储城镇正确的ID与名称values.df:存储城镇ID(部分错误)、名称及town_value字段
需求:使用tidyverse工具集完成数据关联,需优先保留towns.df中的ID,且不能直接基于城镇名称进行关联操作。
示例数据:
library(tidyverse) towns.df <- structure(list(town_id = c(1, 2, 3), town_name = c("Rome", "Madrid", "Sarajevo")), row.names = c(NA, -3L), class = "data.frame") %>% as_tibble() values.df <- structure(list(town_id = c(1, 5, 4), town_name = c("Rome", "Sarajevo", "Madrid"), town_value = c(18, 11, 15)), row.names = c(NA, -3L), class = "data.frame") %>% as_tibble()
数据预览:
> towns.df # A tibble: 3 × 2 town_id town_name <dbl> <chr> 1 1 Rome 2 2 Madrid 3 3 Sarajevo > values.df # A tibble: 3 × 3 town_id town_name town_value <dbl> <chr> <dbl> 1 1 Rome 18 2 5 Sarajevo 11 3 4 Madrid 15
期望输出:
# A tibble: 3 × 3 town_id town_name town_value <dbl> <chr> <dbl> 1 1 Rome 18 2 2 Madrid 15 3 3 Sarajevo 11
解决方案
核心思路:先基于towns.df创建名称到正确ID的映射关系,修正values.df中的错误ID,再通过正确ID完成关联,避免直接用名称做join条件。
具体代码:
# 从towns.df生成名称到正确ID的映射向量 town_id_mapping <- deframe(towns.df %>% select(town_name, town_id)) # 修正values.df中的错误town_id corrected_values <- values.df %>% mutate(town_id = town_id_mapping[town_name]) %>% select(town_id, town_value) # 只保留需要关联的字段 # 关联towns.df与修正后的values数据,保留towns.df的所有ID result <- towns.df %>% left_join(corrected_values, by = "town_id") # 查看结果 result
代码说明:
deframe()将tibble转换为命名向量,实现town_name到town_id的快速映射- 用映射向量替换
values.df中的错误ID,确保ID与towns.df完全一致 - 最后通过
left_join基于正确ID完成关联,严格满足需求
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

