如何在R中遇到向量中的0时重置累计求和?
在R语言中实现遇0重置的累计求和
我来帮你搞定这个问题!你需要的是当向量中出现0时立刻重置累计求和计数,这个需求其实可以通过分组累计求和的思路轻松解决——之前你尝试cumsum和ave没成功,大概率是分组逻辑没找对,下面给你两种实用的实现方法:
方法一:Base R 原生实现(无需额外包)
核心思路是先生成分组标识,每遇到一个0就开启新分组,再在每个分组内做累计求和:
# 定义输入向量 x <- c(0,1,0,0,0,1,1,1,0,1,1) # 生成分组:每遇到0就创建新分组 groups <- cumsum(x == 0) # 在每个分组内执行累计求和 result <- ave(x, groups, FUN = cumsum) # 查看结果 result # 输出:0 1 0 0 0 1 2 3 0 1 2
原理说明:
cumsum(x == 0)会把每个0的位置标记为新分组的起点:比如输入向量中第一个0对应分组1,第二个0对应分组2,非0元素会继承前一个元素的分组。ave(x, groups, FUN = cumsum)会对每个分组内的元素单独执行累计求和,这样每个以0开头的分组,第一个元素的累计和就是0,后续的1会从1开始累加,完美实现“遇0重置”的效果。
方法二:用dplyr实现(适合数据框场景)
如果你平时习惯用tidyverse工具链,也可以用dplyr的分组操作来实现:
library(dplyr) x <- c(0,1,0,0,0,1,1,1,0,1,1) result <- tibble(x = x) %>% # 生成分组标识 group_by(groups = cumsum(x == 0)) %>% # 分组内累计求和 mutate(result = cumsum(x)) %>% ungroup() %>% # 提取结果向量 pull(result) result # 输出:0 1 0 0 0 1 2 3 0 1 2
这个方法和Base R的逻辑完全一致,只是用tidyverse的语法实现,更适合处理数据框中的列操作。
这两种方法都是高效的向量化操作,比循环实现快得多,完全符合你的需求,你可以直接套用在自己的向量上!
内容的提问来源于stack exchange,提问作者Kinjal
相关产品推荐
相关产品推荐

