如何用gsub替换R数据框列中不匹配指定模式的字符串?
解决R语言数据框中反向替换字符串的问题
刚好碰到过类似的需求,给你几种实用的解决办法,都能实现**保留匹配指定模式的字符串、将不匹配的替换为"something"**的效果:
方法1:正则否定环视(gsub直接处理)
R基础的gsub默认不支持否定断言,但开启perl=TRUE后可以用正则的否定先行环视来实现反向匹配。这个正则的逻辑是:匹配“整个字符串完全不在指定列表里”的内容,然后替换成目标值。
代码示例:
library(tidyverse) df <- structure(list(partij_kort = c("COMBGB", "VVD", "GL", "NIEUWEL", "CDA")), .Names = "partij_kort", row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) df %>% mutate(new = gsub("^(?!VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL)$", "something", partij_kort, perl = TRUE))
方法2:grepl + if_else(最直观易读)
这种写法逻辑非常清晰:先用grepl判断字符串是否匹配指定模式,匹配的就保留原内容,不匹配的替换成"something",新手也能一眼看懂。
代码示例:
df %>% mutate(new = if_else(grepl("VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL", partij_kort), partij_kort, "something"))
方法3:case_when(扩展性更强)
如果之后你需要添加更多替换规则(比如不同不匹配值替换成不同内容),用case_when会更灵活,它可以处理多条件分支:
代码示例:
df %>% mutate(new = case_when( grepl("VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL", partij_kort) ~ partij_kort, TRUE ~ "something" # 所有不满足上面条件的都走这里 ))
验证结果
以上三种方法运行后,都能得到你期望的输出:
# A tibble: 5 × 2 partij_kort new <chr> <chr> 1 COMBGB something 2 VVD VVD 3 GL GL 4 NIEUWEL something 5 CDA CDA
内容的提问来源于stack exchange,提问作者Tdebeus
相关产品推荐
相关产品推荐

