R语言如何提取向量中连续重复观测的单值序列
R语言提取向量连续重复块的唯一序列
需求为:对存在连续重复值的向量,保留每段连续重复值的第一个元素,按顺序输出非连续重复的单值序列,跳过中间连续重复项。
示例
- 输入测试向量:
v <- c(1,1,1,2,2,2,1,1,1,2,1,1,2,2,2,2,2,1,1,1) - 期望输出结果:
c(1,2,1,2,1,2,1)
简洁实现方案
你写的for循环逻辑正确,但R有更高效、代码更短的原生实现,不需要加载第三方包:
通用版本(支持所有向量类型:数值、字符、逻辑等)
uniq_v <- v[c(TRUE, v[-1]!= v[-length(v)])]
逻辑说明:
v[-1]是移除第一个元素的向量,v[-length(v)]是移除最后一个元素的向量,二者逐位比较,得到从第二个元素开始,每个元素与前一个元素是否不相等的布尔向量- 向量首位拼接
TRUE,因为第一个元素必然需要保留 - 用最终得到的布尔向量直接取原向量子集,一步得到结果,运行效率远高于手动写for循环,尤其适配长向量场景。
数值向量专属简化写法
如果处理的是数值型向量,可以用diff函数简化代码:
uniq_v <- v[c(1, which(diff(v)!= 0) + 1)]
逻辑说明:diff(v)会逐位计算相邻元素的差值,连续重复值的差值为0,找到差值不为0的位置加1就是值发生跳变的索引,再加上第一个元素的索引1,取对应子集即可。
内容的提问来源于stack exchange,提问作者Giuseppe D'alterio
相关产品推荐
相关产品推荐

