在R中清理重复/近似重复行名的tidy方法咨询
用Tidy风格R代码清理重复/近似重复行名
针对你遇到的Excel数据行名(城市名)重复或近似重复的问题,这里提供两种tidy风格的解决方案,分别处理大小写差异和拼写近似的情况:
1. 快速处理大小写差异的重复行
如果只是大小写不同(比如"Beijing"和"beijing"),可以用stringr统一格式后分组聚合,全程用dplyr的管道操作:
library(tidyverse) # 读取Excel数据,将行名转为列(tidy风格不推荐依赖行名) df_clean <- read_excel("你的数据文件.xlsx") %>% rownames_to_column(var = "city") %>% # 统一格式:可选转小写/首字母大写,这里用首字母大写统一 mutate(city_clean = str_to_title(city)) %>% # 按清理后的城市名分组,聚合数值列(sum可替换为mean/median等,按需调整) group_by(city_clean) %>% summarise(across(everything(), sum)) %>% # 可选:将清理后的城市名转回行名(不推荐,建议保留列形式) column_to_rownames(var = "city_clean")
2. 处理拼写近似的重复行(如"Beijing"和"Beijng")
对于拼写接近的近似重复,需要结合stringdist包计算字符串相似度,再合并分组:
library(tidyverse) library(stringdist) # 读取数据并转出行名列 df <- read_excel("你的数据文件.xlsx") %>% rownames_to_column(var = "city") %>% # 先统一大小写,减少干扰 mutate(city = str_to_title(city)) # 生成城市配对并计算Jaro-Winkler相似度(适合短字符串匹配) city_matches <- expand_grid(city1 = df$city, city2 = df$city) %>% filter(city1 != city2) %>% mutate(similarity = 1 - stringdist(city1, city2, method = "jw")) %>% filter(similarity > 0.9) # 相似度阈值,越高匹配越严格,按需调整 # 构建城市分组映射:将相似城市映射到同一个基准名 city_groups <- df %>% mutate(group_name = map_chr(city, ~{ # 找到所有与当前城市相似的名称 related <- c(.x, city_matches %>% filter(city1 == .x | city2 == .x) %>% pull(city2)) # 取字典序最小的作为分组基准名 min(related) })) %>% distinct(city, group_name) # 合并数据并聚合 df_clean <- df %>% left_join(city_groups, by = "city") %>% group_by(group_name) %>% summarise(across(everything(), sum)) %>% rename(city = group_name)
注意事项
- tidy风格优先推荐将城市名作为普通列处理,而非依赖行名,这样后续的筛选、分组操作更灵活。
- 聚合函数(
sum)可根据你的数据类型替换:如果是分类列可以用first()取第一个值,数值列用mean()取均值等。 - 近似匹配的阈值(相似度>0.9)需要根据你的数据调整,比如拼写差异大的可以适当降低阈值。
内容的提问来源于stack exchange,提问作者VitalStatistix
相关产品推荐
相关产品推荐

