使用mutate与case_when替换字符串报错,求解决方案
统一姓名格式时case_when报错的解决方法
错误原因
你的case_when条件写法违反了R的语法规则:逻辑或运算符|要求两侧必须是逻辑值(TRUE/FALSE),但你直接在|后写了字符串(比如Fieldworker == "SAM CROFTS" | "Sam crofts"),R无法将字符串转换为逻辑值,因此触发类型不匹配错误。
修正后的case_when代码
正确的写法是对每个变体都重复Fieldworker ==,或者用%in%简化多值匹配(推荐),同时要添加TRUE ~ Fieldworker保留未匹配的原始值,避免出现NA:
library(dplyr) Unique_names %>% mutate(Fieldworker = case_when( Fieldworker %in% c("SAM CROFTS", "Sam crofts", "SamCrofts", " Sam Crofts") ~ "Sam Crofts", Fieldworker %in% c("KEITH MCMAHON", "Keith Mc Mahon", "Keith McMhon", "KeithMcMahon", " Keith McMahon") ~ "Keith McMahon", Fieldworker %in% c("Ada Grabowska", "Ada Grabowska Zhang", " Ada Grabowska") ~ "Ada Grabowska-Zhang", Fieldworker == "Nico Alioravainenn" ~ "Nico Alioravainen", Fieldworker %in% c("STEPHEN LANG", "Stephen lang") ~ "Stephen Lang", Fieldworker == "NICOLE MILLIGAN" ~ "Nicole Milligan", Fieldworker == " Will Smith" ~ "Will Smith", Fieldworker == "JOSH FIRTH" ~ "Josh Firth", Fieldworker == "Joshua Evans" ~ "Josh Evans", Fieldworker %in% c("EMILY SIMMONDS", "Emily Simmond") ~ "Emily Simmonds", Fieldworker %in% c("MICHELE LEVEQUE-SHAW", "Michele leveque Shaw", "Michele Shaw", "Michele leveque-shaw") ~ "Michele Leveque-Shaw", Fieldworker %in% c(" Andy Gosler", "AndyGosler") ~ "Andy Gosler", Fieldworker == "LUCY APLIN" ~ "Lucy Aplin", Fieldworker == "ERIK SANDVIG" ~ "Erik Sandvig", Fieldworker %in% c("FREDDY HILLEMAN", "Freddy hillemann", "freddy Hillemann", "Friederike Hillermann", "Friederike Hillemann") ~ "Freddy Hillemann", Fieldworker %in% c("DAMIEN FARINE", "Damien Fairne") ~ "Damien Farine", Fieldworker %in% c("Ashley Cook", "Ashley cook", "Ashley Sindell Price", "Ash Sindell Price", "Ashley sindell Price", "Ashley Sendell Price", "Ash Sendell-Price") ~ "Ashley Sendell-Price", Fieldworker %in% c("koosje Lamers", "KOOSJE LAMERS") ~ "Koosje Lamers", Fieldworker == "Martyna syposz" ~ "Martina Syposz", Fieldworker == "Michal Jeziersk" ~ "Michal Jezierski", Fieldworker %in% c("kanerva Korhonen", "KAnerva Korhonen") ~ "Kanerva Korhonen", Fieldworker %in% c("JuliaHaynes", " Julia Haynes") ~ "Julia Haynes", Fieldworker %in% c("Nilo Merino Recalde", "Nilo Recalde", " Nilo Merino Recalde", "NiloMerinoRecalde", " Nilo Merino-Recalde") ~ "Nilo Merino-Recalde", Fieldworker %in% c(" Andrea Estandia", "AndreaEstandia") ~ "Andrea Estandia", Fieldworker %in% c("Peter santema", "Petersantema", "PeterSantema", " Peter Santema") ~ "Peter Santema", Fieldworker %in% c("CharlotteRegan", " Charlotte Regan") ~ "Charlotte Regan", Fieldworker %in% c("KristinaBeck", " Kristina Beck") ~ "Kristina Beck", Fieldworker %in% c("CarysJones", " Carys Jones") ~ "Carys Jones", Fieldworker %in% c("AnettKiss", " Anett Kiss") ~ "Anett Kiss", Fieldworker %in% c("JoeWoodman", " Joe Woodman") ~ "Joe Woodman", Fieldworker %in% c("DeniseWawman", " Denise Wawman") ~ "Denise Wawman", TRUE ~ Fieldworker # 保留未匹配的原始姓名 ))
更高效的实现方案:映射表+left_join
当姓名变体数量较多时,case_when会变得冗长难维护,推荐使用映射表+left_join的方式,集中管理姓名匹配规则:
1. 创建姓名映射表
name_lookup <- tibble( original_name = c( "SAM CROFTS", "Sam crofts", "SamCrofts", " Sam Crofts", "KEITH MCMAHON", "Keith Mc Mahon", "Keith McMhon", "KeithMcMahon", " Keith McMahon", "Ada Grabowska", "Ada Grabowska Zhang", " Ada Grabowska", "Nico Alioravainenn", "STEPHEN LANG", "Stephen lang", "NICOLE MILLIGAN", " Will Smith", "JOSH FIRTH", "Joshua Evans", "EMILY SIMMONDS", "Emily Simmond", "MICHELE LEVEQUE-SHAW", "Michele leveque Shaw", "Michele Shaw", "Michele leveque-shaw", " Andy Gosler", "AndyGosler", "LUCY APLIN", "ERIK SANDVIG", "FREDDY HILLEMAN", "Freddy hillemann", "freddy Hillemann", "Friederike Hillermann", "Friederike Hillemann", "DAMIEN FARINE", "Damien Fairne", "Ashley Cook", "Ashley cook", "Ashley Sindell Price", "Ash Sindell Price", "Ashley sindell Price", "Ashley Sendell Price", "Ash Sendell-Price", "koosje Lamers", "KOOSJE LAMERS", "Martyna syposz", "Michal Jeziersk", "kanerva Korhonen", "KAnerva Korhonen", "JuliaHaynes", " Julia Haynes", "Nilo Merino Recalde", "Nilo Recalde", " Nilo Merino Recalde", "NiloMerinoRecalde", " Nilo Merino-Recalde", " Andrea Estandia", "AndreaEstandia", "Peter santema", "Petersantema", "PeterSantema", " Peter Santema", "CharlotteRegan", " Charlotte Regan", "KristinaBeck", " Kristina Beck", "CarysJones", " Carys Jones", "AnettKiss", " Anett Kiss", "JoeWoodman", " Joe Woodman", "DeniseWawman", " Denise Wawman" ), standardized_name = c( rep("Sam Crofts", 4), rep("Keith McMahon", 5), rep("Ada Grabowska-Zhang", 3), "Nico Alioravainen", rep("Stephen Lang", 2), "Nicole Milligan", "Will Smith", "Josh Firth", "Josh Evans", rep("Emily Simmonds", 2), rep("Michele Leveque-Shaw", 4), rep("Andy Gosler", 2), "Lucy Aplin", "Erik Sandvig", rep("Freddy Hillemann", 5), rep("Damien Farine", 2), rep("Ashley Sendell-Price", 7), rep("Koosje Lamers", 2), "Martina Syposz", "Michal Jezierski", rep("Kanerva Korhonen", 2), rep("Julia Haynes", 2), rep("Nilo Merino-Recalde", 5), rep("Andrea Estandia", 2), rep("Peter Santema", 4), rep("Charlotte Regan", 2), rep("Kristina Beck", 2), rep("Carys Jones", 2), rep("Anett Kiss", 2), rep("Joe Woodman", 2), rep("Denise Wawman", 2) ) )
2. 执行匹配与统一
Unique_names %>% left_join(name_lookup, by = c("Fieldworker" = "original_name")) %>% mutate(Fieldworker = ifelse(is.na(standardized_name), Fieldworker, standardized_name)) %>% select(-standardized_name)
这种方式的优势在于:映射规则集中存储,后续修改或添加变体时只需调整name_lookup,代码结构更清晰,维护成本更低。
内容的提问来源于stack exchange,提问作者McMahok
相关产品推荐
相关产品推荐

