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

在R语言中统计向量正数前连续0个数并生成新向量

嘿,我完全get到你的需求了——就是要从R向量里找出所有「连续0 + 紧随其后的第一个正数」的片段,然后把每个片段里的0的数量收集成新向量对吧?我给你准备了两种实用的实现方法,都是R里常用的思路:

方法一:用基础R的rle()函数(无需额外包)

rle()是R处理连续重复值的神器,刚好能帮我们拆分出连续的0或正数片段。核心思路是先把向量拆成连续重复值的片段,再筛选出「后面紧跟着正数的0片段」,记录它们的长度。

# 先定义一个示例向量(你可以替换成自己的向量)
vec <- c(0,0,3,0,5,0,0,0,2,4,0,1)

# 用rle拆分连续片段
rle_result <- rle(vec)
values <- rle_result$values  # 每个片段的取值
lengths <- rle_result$lengths  # 每个片段的长度

# 初始化结果向量
zero_counts <- c()

# 遍历每个片段(跳过最后一个,因为要检查下一个片段)
for(i in seq_along(values)[-length(values)]){
  # 筛选:当前是0片段,且下一个是正数片段
  if(values[i] == 0 & values[i+1] > 0){
    zero_counts <- c(zero_counts, lengths[i])
  }
}

# 查看结果
zero_counts
# 输出: [1] 2 1 3 1

方法二:用tidyverse工具包(更简洁的管道风格)

如果你习惯用tidyverse的语法,用dplyr和tidyr可以写出更直观的管道代码,逻辑和上面一致,但可读性更强:

library(dplyr)
library(tidyr)

vec <- c(0,0,3,0,5,0,0,0,2,4,0,1)

tibble(value = vec) %>%
  # 给每个连续的同值片段分配唯一编号
  mutate(group = consecutive_id(value)) %>%
  # 按片段分组,汇总每个片段的取值和长度
  group_by(group) %>%
  summarise(val = first(value), len = n()) %>%
  ungroup() %>%
  # 筛选出「当前是0片段,且下一个是正数片段」的记录
  filter(val == 0 & lead(val) > 0) %>%
  # 提取0的数量作为结果
  pull(len)

# 输出: [1] 2 1 3 1

边界情况说明

这两种方法都自动处理了这些特殊情况:

  • 向量开头是正数:不会被统计(因为前面没有0片段)
  • 向量结尾是0:不会被统计(因为后面没有正数)
  • 多个连续正数:只有第一个正数前面的0片段会被统计,后续正数因为前面没有0,所以不纳入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:55:49