如何用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
相关产品推荐
相关产品推荐

