使用str_replace_all按国家分组替换球队简称时出现错误问题
问题描述
我需要将球队简称替换为全称,但目前出现两个问题:
- 本该不被替换的内容被错误替换
- 替换操作未按国家条件限制执行
我尝试用tidyverse代码实现,但group_by(country)没能解决问题,代码如下:
library(tidyverse) df <- structure(list(country = c("ENG", "ESP", "ITA", "GER", "FRA", "BRA"), team_name = c("Huddersfield", "Betis", "Inter", "Leverkusen", "Paris S-G", "Internazionale")), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -6L)) teams_names_replace <- c( "Huddersfield" = "Huddersfield Town", "Inter" = "Internazionale", "Paris S-G" = "Paris Saint-Germain", "Betis" = "Real Betis", "Leverkusen" = "Bayer Leverkusen" ) df %>% mutate(team_name_long = str_replace_all( team_name, c(teams_names_replace)))
解决方案
当前代码的问题在于str_replace_all是全局替换,既不区分国家,还会匹配子串导致误替换。正确做法是采用精确匹配+按国家绑定映射规则的方式:
- 先创建包含国家、球队简称、球队全称的映射表,确保替换规则和国家严格对应:
team_mapping <- tribble( ~country, ~team_short, ~team_long, "ENG", "Huddersfield", "Huddersfield Town", "ESP", "Betis", "Real Betis", "ITA", "Inter", "Internazionale", "GER", "Leverkusen", "Bayer Leverkusen", "FRA", "Paris S-G", "Paris Saint-Germain" )
- 使用
left_join将原数据与映射表匹配,仅替换对应国家的目标球队,未匹配到的内容(如巴西的Internazionale)保留原名称:
df %>% left_join(team_mapping, by = c("country", "team_name" = "team_short")) %>% mutate(team_name_long = ifelse(is.na(team_long), team_name, team_long)) %>% select(-team_long) # 可选:移除临时生成的team_long列
运行后结果:
# A tibble: 6 × 3 country team_name team_name_long <chr> <chr> <chr> 1 ENG Huddersfield Huddersfield Town 2 ESP Betis Real Betis 3 ITA Inter Internazionale 4 GER Leverkusen Bayer Leverkusen 5 FRA Paris S-G Paris Saint-Germain 6 BRA Internacional Internacional
这种方法彻底避免误替换,同时严格遵循国家条件限制,比全局替换更精准可控。
内容的提问来源于stack exchange,提问作者Cristiano
相关产品推荐
相关产品推荐

