如何计算tibble中变量X的连续累积和?
计算布尔变量的连续累积和
原始数据构造
library(tibble) dt <- tibble(id = rep(1,8), year = 2001:2008, X = c(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE,TRUE,TRUE))
解决方案代码
使用dplyr包可高效实现需求,核心思路是先划分连续状态的区块,再在每个区块内计算累积和:
library(dplyr) dt_result <- dt %>% # 生成连续状态的分组标识:每遇到FALSE,分组号递增 mutate(group = cumsum(!X)) %>% # 按分组计算组内累积和 group_by(group) %>% mutate(cumN = cumsum(X)) %>% ungroup() %>% # 移除临时分组列 select(-group) # 查看结果 dt_result
运行结果
# A tibble: 8 × 4 id year X cumN <dbl> <int> <lgl> <int> 1 1 2001 FALSE 0 2 1 2002 TRUE 1 3 1 2003 TRUE 2 4 1 2004 FALSE 0 5 1 2005 FALSE 0 6 1 2006 TRUE 1 7 1 2007 TRUE 2 8 1 2008 TRUE 3
代码解释
cumsum(!X):将X取反后累积求和,每遇到一个FALSE,分组号就加1,这样连续的TRUE或FALSE会被归为同一组,实现"连续区块"的划分。- 按
group分组后用cumsum(X)计算累积和:TRUE对应数值1,组内累积会从1开始递增;FALSE对应数值0,组内累积始终为0,完全匹配需求。
多ID场景适配
如果数据包含多个id,需要保证每个id独立计算,只需在分组时加入id:
dt_result <- dt %>% group_by(id) %>% mutate(group = cumsum(!X)) %>% group_by(id, group) %>% mutate(cumN = cumsum(X)) %>% ungroup() %>% select(-group)
内容的提问来源于stack exchange,提问作者X.Jun
相关产品推荐
相关产品推荐

