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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:47:05