在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
相关产品推荐
相关产品推荐

