如何在R语言数据框中按规则批量替换列中特定值?
R语言数据框按规则生成新列的解决办法
为啥你的str_replace_all用不对?
你当前代码出错的关键是:str_replace_all是字符串模糊匹配,不是针对数值的精确匹配。比如ID.old里的11转成字符串后,会先被规则里的"1"匹配替换成a11,而不是识别完整的"11"替换成a1,自然出不来预期结果。
三种正确实现方式
方式1:用数学规律(最简单高效)
看你的替换规则,每5个数字循环对应a1到a5,直接用公式算组内序号再拼前缀就行:
library(dplyr) df1 <- df1 %>% mutate(ID.new = paste0("a", ((ID.old - 1) %% 5) + 1))
方式2:用case_when(规则一目了然,适合改需求)
如果之后规则要调整,用case_when把每个条件列出来,看着更清楚:
library(dplyr) df1 <- df1 %>% mutate(ID.new = case_when( ID.old %in% c(1,6,11,16) ~ "a1", ID.old %in% c(2,7,12,17) ~ "a2", ID.old %in% c(3,8,13,18) ~ "a3", ID.old %in% c(4,9,14,19) ~ "a4", ID.old %in% c(5,10,15,20) ~ "a5" ))
方式3:修正str_replace_all的用法(精确匹配字符串)
要是非得用stringr包,给每个匹配规则加上单词边界\\b,确保只匹配完整的数字字符串:
library(stringr) library(dplyr) # 先把数值转成字符串 df1 <- df1 %>% mutate(ID.new = as.character(ID.old)) # 给每个规则加边界符 replace_rules <- c("\\b1\\b"="a1", "\\b2\\b"="a2", "\\b3\\b"="a3", "\\b4\\b"="a4", "\\b5\\b"="a5", "\\b6\\b"="a1", "\\b7\\b"="a2", "\\b8\\b"="a3", "\\b9\\b"="a4", "\\b10\\b"="a5", "\\b11\\b"="a1", "\\b12\\b"="a2", "\\b13\\b"="a3", "\\b14\\b"="a4", "\\b15\\b"="a5", "\\b16\\b"="a1", "\\b17\\b"="a2", "\\b18\\b"="a3", "\\b19\\b"="a4", "\\b20\\b"="a5") df1$ID.new <- str_replace_all(df1$ID.new, replace_rules)
验证结果
随便跑上面一种方法后,用all.equal(df1$ID.new, df2$ID.new)检查,返回TRUE就说明结果符合预期。
内容的提问来源于stack exchange,提问作者Pegi
相关产品推荐
相关产品推荐

