R语言如何在变量A分组内新序列起始时生成sub_id
R 分组内生成序列标识sub_id的解决方案
问题说明
现有如下tibble结构数据:
tibble( A = c(1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5), B = c(1, 1, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 3, 4, 1, 1), )
数据预览:
# A tibble: 16 x 2 A B <dbl> <dbl> 1 1 1 2 2 1 3 2 2 4 2 1 5 2 2 6 2 3 7 3 1 8 3 2 9 3 1 10 3 1 11 4 1 12 4 2 13 4 3 14 4 4 15 4 1 16 5 1
需要实现的效果:以字段A作为分组依据,每当组内出现B=1时作为新序列的起始,生成对应的sub_id字段,期望输出如下:
tibble( A = c(1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5), B = c(1, 1, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 3, 4, 1, 1), sub_id = c(1, 1, 1, 2, 2, 2, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1) )
输出预览:
# A tibble: 16 x 3 A B sub_id <dbl> <dbl> <dbl> 1 1 1 1 2 2 1 1 3 2 2 1 4 2 1 2 5 2 2 2 6 2 3 2 7 3 1 1 8 3 2 1 9 3 1 2 10 3 1 3 11 4 1 1 12 4 2 1 13 4 3 1 14 4 4 1 15 4 1 2 16 5 1 1
实现方法
使用tidyverse套件的dplyr库即可实现该逻辑,核心是在A的分组内,对B==1的判断结果做累加求和:
library(tidyverse) # 构造原始数据 df <- tibble( A = c(1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5), B = c(1, 1, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 3, 4, 1, 1), ) # 生成sub_id df_result <- df %>% group_by(A) %>% mutate(sub_id = cumsum(B == 1)) %>% ungroup()
逻辑说明
在每个A的分组内:
- 当B等于1时,
B==1返回逻辑值TRUE,对应数值为1;否则返回FALSE,对应数值为0 - 对上述逻辑值序列做累加求和
cumsum(),每次遇到B=1时累加值加1,刚好对应新序列的起始标识
内容的提问来源于stack exchange,提问作者James Bejon
相关产品推荐
相关产品推荐

