R语言str_replace_all无法替换部分指定字符串是什么原因?
问题原因
stringr::str_replace_all 默认采用正则表达式规则进行模式匹配,你需要替换的两个疾病名称中包含(、)正则特殊字符,这类字符在正则语法中有分组的特殊语义,不会被识别为普通的括号文本,因此无法匹配到原始字符串中的对应内容,出现无报错但替换失败的情况。
解决方案
方案1:使用fixed()声明固定文本匹配(最便捷)
给所有需要匹配的原字符串套上fixed()函数,告知函数将匹配内容作为普通固定文本处理,不需要解析正则语义,修改后的代码如下:
codelists <- data.frame(Disease = sample(c("Peripheral neuropathies (excluding cranial nerve and carpal tunnel syndromes)", "Primary Malignancy_Brain, Other CNS and Intracranial", "Venous thromboembolic disease (Excl PE)"), 15, replace = T), Codes = 1:15) codelists <- codelists[order(codelists$Disease), ] library(stringr) codelists$Disease2 <- str_replace_all(codelists$Disease, c( fixed("Peripheral neuropathies (excluding cranial nerve and carpal tunnel syndromes)") = "Non-diabetic peripheral neuropathies (excluding cranial nerves and carpal tunnel syndrome)", fixed("Primary Malignancy_Brain, Other CNS and Intracranial") = "Primary malignancy brain, other CNS and intracranial", fixed("Venous thromboembolic disease (Excl PE)") = "Venous thromboembolism" ))
方案2:转义正则特殊字符
如果需要保留正则匹配能力,给所有正则特殊字符前加双反斜杠(R语言中转义符需要写两次)进行转义,示例如下:
codelists$Disease2 <- str_replace_all(codelists$Disease, c( "Peripheral neuropathies \\(excluding cranial nerve and carpal tunnel syndromes\\)" = "Non-diabetic peripheral neuropathies (excluding cranial nerves and carpal tunnel syndrome)", "Primary Malignancy_Brain, Other CNS and Intracranial" = "Primary malignancy brain, other CNS and intracranial", "Venous thromboembolic disease \\(Excl PE\\)" = "Venous thromboembolism" ))
方案3:整值映射替换(更适合全匹配场景)
如果你的需求是对整个疾病名称做完全匹配替换,不需要模糊匹配,直接用命名向量映射的方式更稳妥,完全规避正则语法的坑,代码如下:
replace_map <- c( "Peripheral neuropathies (excluding cranial nerve and carpal tunnel syndromes)" = "Non-diabetic peripheral neuropathies (excluding cranial nerves and carpal tunnel syndrome)", "Primary Malignancy_Brain, Other CNS and Intracranial" = "Primary malignancy brain, other CNS and intracranial", "Venous thromboembolic disease (Excl PE)" = "Venous thromboembolism" ) codelists$Disease2 <- replace_map[codelists$Disease]
内容的提问来源于stack exchange,提问作者Nao
相关产品推荐
相关产品推荐

