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

基于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

代码说明:

  1. deframe()将tibble转换为命名向量,实现town_name到town_id的快速映射
  2. 用映射向量替换values.df中的错误ID,确保ID与towns.df完全一致
  3. 最后通过left_join基于正确ID完成关联,严格满足需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:25:50