如何获取R语言向量中连续0序列的长度?
解决R语言中计算连续0序列长度的问题
针对你给出的向量a <- c(0,0,1,0,3,0,0,0,0,5,6),要提取每段连续0的长度,最简洁高效的方法是用R内置的rle()游程编码函数,具体实现如下:
方法一:使用rle()函数(推荐)
# 定义目标向量 a <- c(0,0,1,0,3,0,0,0,0,5,6) # 生成游程编码结果 run_lengths <- rle(a) # 筛选出值为0的连续段长度 zero_sequence_lengths <- run_lengths$lengths[run_lengths$values == 0] # 查看结果 zero_sequence_lengths
运行这段代码后,输出结果正好是你期望的:
[1] 2 1 4
原理解释
rle()函数会把向量转换成一个列表,包含两个核心元素:values:向量中连续重复的数值lengths:对应数值连续出现的次数
- 我们只需要通过
run_lengths$values == 0筛选出所有值为0的游程,再提取对应的lengths,就得到了每段连续0的长度。
方法二:手动分组统计(适合理解底层逻辑)
如果想手动实现逻辑,可以通过diff()和cumsum()给不同的连续段分组,再统计0所在组的长度:
a <- c(0,0,1,0,3,0,0,0,0,5,6) # 给每个连续段分配组ID group_ids <- cumsum(c(TRUE, diff(a != 0) != 0)) # 筛选出0的组,统计每组的长度 zero_lengths <- tapply(a == 0, group_ids, sum)[tapply(a == 0, group_ids, any)] zero_lengths
这个方法的结果和第一种一致,但代码相对繁琐,日常使用还是推荐rle()。
内容的提问来源于stack exchange,提问作者Loulou
相关产品推荐
相关产品推荐

