在R中基于分组匹配查找表重编码混乱球队名称
按赛事匹配查找表标准化球队名称
我有一个tibble数据框,其中team变量存在同一球队的不同名称变体(比如“Newcastle United”或“Newcastle”),而且不同赛事(competition)下的同名变体对应不同球队(比如英超和澳超都有纽卡斯尔相关球队)。
示例数据:
team = c('Newcastle United','Newcastle','Newcastle Utd','Newcastle United Jets','Newcastle','Newcastle Jets') competition=c('Premier League','Premier League','Premier League','A-League','A-League','A-League') df = tibble(team,competition) # 输出结果: # A tibble: 6 × 2 # team competition # <chr> <chr> #1 Newcastle United Premier League #2 Newcastle Premier League #3 Newcastle Utd Premier League #4 Newcastle United Jets A-League #5 Newcastle A-League #6 Newcastle Jets A-League
同时有一个查找表,指定了各赛事下旧球队名称对应的标准名称:
old_name=c('Newcastle','Newcastle Utd','Newcastle','Newcastle United Jets') new_name=c('Newcastle United','Newcastle United','Newcastle Jets','Newcastle Jets') competition=c('Premier League','Premier League','A-League','A-League') lookup=tibble(old_name,new_name,competition) # 输出结果: # A tibble: 4 × 3 # old_name new_name competition # <chr> <chr> <chr> #1 Newcastle Newcastle United Premier League #2 Newcastle Utd Newcastle United Premier League #3 Newcastle Newcastle Jets A-League #4 Newcastle United Jets Newcastle Jets A-League
需要根据赛事匹配查找表,对team变量进行重编码,同时处理无匹配的情况(保留原名称)。之前试过用dplyr的group_by+recode没成功,期望得到如下标准化结果:
# A tibble: 6 × 2 # team competition # <chr> <chr> #1 Newcastle United Premier League #2 Newcastle United Premier League #3 Newcastle United Premier League #4 Newcastle Jets A-League #5 Newcastle Jets A-League #6 Newcastle Jets A-League
解决方案:使用dplyr的left_join+coalesce
核心思路是通过赛事和球队名称双维度关联查找表,匹配到标准名称后,自动保留无匹配的原名称。
代码实现:
library(dplyr) df_standardized <- df %>% # 按赛事+原球队名关联查找表 left_join(lookup, by = c("competition" = "competition", "team" = "old_name")) %>% # 优先用匹配到的标准名,无匹配则保留原名 mutate(team = coalesce(new_name, team)) %>% # 移除临时列 select(-new_name) # 查看标准化后的数据 df_standardized
关键步骤说明:
left_join:确保只有同一赛事下的同名球队才会匹配,避免跨赛事的名称混淆coalesce(new_name, team):如果查找表中有对应条目就替换为标准名,没有则保持原名称,完美处理无匹配场景select(-new_name):清理临时生成的辅助列,还原目标数据结构
运行后即可得到预期的标准化结果。
内容的提问来源于stack exchange,提问作者mrroy
相关产品推荐
相关产品推荐

