如何用dplyr风格计算分组内基于末尾值的x连续为1的次数?
按分组统计末尾连续为1的次数
给定如下R语言数据框dat,需按grp字段分组,以每组order=4的记录为起点向前统计x字段连续等于1的次数,要求采用dplyr风格实现。
示例数据
library(dplyr) dat <- data.frame( order = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4), x = c(1, 1, 1, 0.5, 1, 1, 1, 1, 1, 0.5, 0.5, 1), grp = c(rep("gr1", 4), rep("grp2", 4), rep("grp3", 4)) ) dat #> order x grp #> 1 1 1.0 gr1 #> 2 2 1.0 gr1 #> 3 3 1.0 gr1 #> 4 4 0.5 gr1 #> 5 1 1.0 grp2 #> 6 2 1.0 grp2 #> 7 3 1.0 grp2 #> 8 4 1.0 grp2 #> 9 1 1.0 grp3 #> 10 2 0.5 grp3 #> 11 3 0.5 grp3 #> 12 4 1.0 grp3
期望输出
#> x grp #> 1 0 grp1 #> 2 4 grp2 #> 3 1 grp3
解决方案
dat %>% group_by(grp) %>% # 组内按order降序排列,确保从order=4的记录开始向前遍历 arrange(desc(order), .by_group = TRUE) %>% # 标记当前x是否等于1 mutate(is_one = x == 1) %>% # 用累积求和生成连续块的ID,遇到非1值时ID递增 mutate(run_id = cumsum(!is_one)) %>% # 筛选出从末尾开始的连续1的块(run_id=0的部分) filter(run_id == 0) %>% # 统计该块的行数,即为连续1的次数 summarise(x = n()) %>% ungroup()
代码说明
group_by(grp):按grp字段分组处理arrange(desc(order), .by_group = TRUE):组内按order降序,让每组的第一条记录是order=4的末尾数据mutate(is_one = x == 1):标记每条记录的x是否为1mutate(run_id = cumsum(!is_one)):通过累积非1值的数量,将连续的1和非1分割成不同的块,从末尾开始的连续1会被标记为run_id=0filter(run_id == 0):仅保留从末尾开始的连续1的部分summarise(x = n()):统计该部分的行数,得到连续1的次数
内容的提问来源于stack exchange,提问作者boshek
相关产品推荐
相关产品推荐

