使用stringr优化cut生成的分箱标签格式问题求助
解决cut分箱标签美化与批量替换问题
1. 精准处理含Inf的首尾分箱标签
针对含-Inf和Inf的分箱标签,用正则表达式一次性匹配替换,同时调整符号位置并移除多余括号:
library(dplyr) library(stringr) xbreaks <- c(-Inf, -2, -1, 0, 1, 2, Inf) df <- data.frame(x=rnorm(1000)) %>% mutate(xbins = cut(x, breaks = xbreaks)) labs <- unique(df$xbins) # 处理含Inf的标签:匹配(-Inf, num]替换为< num;匹配(num, Inf]替换为> num prettylabs <- str_replace_all(labs, c("\\(-Inf, (-?\\d+)\\]" = "< \\1", "\\((-?\\d+), Inf\\]" = "> \\1")) prettylabs # 输出:[1] "(-1,0]" "(0,1]" "(1,2]" "(-2,-1]" "> 2" "< -2"
正则说明:
\\(-Inf, (-?\\d+)\\]:匹配(-Inf, 数字]格式,捕获数字部分,替换为< 数字\\((-?\\d+), Inf\\]:匹配(数字, Inf]格式,捕获数字部分,替换为> 数字
2. 批量替换因子标签(无需手动输入)
直接利用因子的levels属性批量替换,或者用dplyr::fct_recode结合命名向量,自动匹配旧标签和新标签:
方法1:修改因子levels
# 直接给df$xbins的levels赋值新标签 levels(df$xbins) <- prettylabs # 查看结果 head(df$xbins)
方法2:用fct_recode(自动生成命名向量)
library(forcats) # 生成旧标签对应新标签的命名向量 lab_mapping <- set_names(prettylabs, labs) # 批量替换 df <- df %>% mutate(xbins = fct_recode(xbins, !!!lab_mapping))
这样不用手动逐个输入标签对,完全自动匹配。
3. 简化移除所有括号的操作
不用多次调用str_replace_all,用str_remove_all匹配所有括号字符(()[]),一次搞定:
prettylabs2 <- str_remove_all(labs, "[\\(\\)\\[\\]]") %>% str_replace_all(", ", " - ") %>% # 最后调整>的位置 str_replace("(\\d+)>", "> \\1") prettylabs2 # 输出:[1] "-1 - 0" "0 - 1" "1 - 2" "-2 - -1" "> 2" "< -2"
这里[\\(\\)\\[\\]]是字符集,匹配所有括号;最后用str_replace把数字>换成> 数字即可。
内容的提问来源于stack exchange,提问作者Jaken
相关产品推荐
相关产品推荐

