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

如何用R(tidyverse)匹配station_id批量修正station_name字段

清洗共享单车站点名称:用tidyverse及更优方案实现标准化

核心解决方案(tidyverse)

利用dplyr的left_join关联主数据集与映射表,直接替换错误的站点名称:

library(tidyverse)

# 示例主数据(含错误站点名)
main_data <- tibble(
  trip_id = 1:5,
  station_id = c(101, 102, 101, 103, 102),
  station_name = c("XX公园南门", "XX地铁站西", "XX公圆南门", "XX商圈北", "XX地铁战西")
)

# 标准名称映射表(唯一station_id对应标准名)
name_mapping <- tibble(
  station_id = c(101, 102, 103),
  standard_station_name = c("XX公园南门", "XX地铁站西", "XX商圈北")
)

# 执行匹配替换
cleaned_data <- main_data %>%
  left_join(name_mapping, by = "station_id") %>%
  mutate(station_name = standard_station_name) %>%
  select(-standard_station_name)

print(cleaned_data)

说明:

  • left_join确保主数据所有行都保留,即使存在映射表未覆盖的station_id(若映射表已覆盖所有ID,可用inner_join)
  • mutate直接用标准名称覆盖原错误字段,最后移除临时的standard_station_name字段

更优处理方案

1. data.table(大数据场景首选)

当主数据集行数达百万级时,data.table的连接性能远高于tidyverse,操作更简洁:

library(data.table)

setDT(main_data)
setDT(name_mapping)

# 关联并替换,一步完成
cleaned_data_dt <- main_data[name_mapping, on = "station_id", 
                             station_name := i.standard_station_name]

print(cleaned_data_dt)

2. Base R(无需额外依赖)

用match函数匹配索引,轻量实现替换:

# 匹配每个station_id对应的标准名称位置
name_idx <- match(main_data$station_id, name_mapping$station_id)
# 替换原站点名称
main_data$station_name <- name_mapping$standard_station_name[name_idx]

print(main_data)

关键注意事项

  • 确保映射表中station_id唯一,否则连接会产生重复行
  • 提前排查主数据中未被映射的ID,避免替换后出现NA:
    unmatched_ids <- main_data %>%
      anti_join(name_mapping, by = "station_id") %>%
      distinct(station_id)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:22:17