You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中如何去除字符串连续重复元素并保留单个副本?

在R中去除字符串连续重复字符的最优方法

你需要把连续重复的字符仅保留单个副本,这个需求在R里有几种高效的实现方式,我给你拆解一下:

1. Base R原生方案(无依赖,性能优)

这是我最推荐的方法,用R内置的rle()函数(游程编码)来处理,完全不需要额外安装包,处理大字符串时效率也很高:

# 原始字符串
string <- "YYYYYXXXYYXZYYZ"

# 步骤1:把字符串拆分为单个字符的向量
char_vec <- strsplit(string, "")[[1]]

# 步骤2:用rle提取连续重复元素的唯一值
rle_obj <- rle(char_vec)
unique_chars <- rle_obj$values

# 步骤3:拼接回字符串
result <- paste(unique_chars, collapse = "")

# 输出结果
result
# [1] "YXYXZYZ"

原理很简单:rle()会把连续重复的元素分组,记录每组的长度和对应的值,我们只需要提取每组的唯一值,再拼接起来就完成了去重。

2. stringr包正则方案(代码简洁)

如果你平时用tidyverse生态,stringr包的正则替换可以一行搞定,代码更简洁直观:

library(stringr)

string <- "YYYYYXXXYYXZYYZ"
result <- str_replace_all(string, "(.)\\1+", "\\1")

result
# [1] "YXYXZYZ"

正则表达式(.)\\1+的意思是:匹配任意单个字符((.)),后面跟着一个或多个和它相同的字符(\\1+,\\1代表第一个捕获组的内容),然后把整个匹配的部分替换成单个的那个字符(\\1)。

最优方案选择

  • 如果追求无依赖、高性能:优先选Base R的rle()方法,尤其是处理超长字符串时,它的运行速度比正则方法更快。
  • 如果追求代码简洁、在tidyverse流程中:stringr的正则替换一行代码就能完成,可读性也不错。

内容的提问来源于stack exchange,提问作者dbk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:07:23