我需要在给定组ID和显示新子组开始的指示符的情况下分配子组ID。这是一个测试数据集:
group <- c(rep("A", 8), rep("B", 8))
x1 <- c(rep(0, 3), rep(1, 3), rep(0, 2))
x2 <- rep(0:1, 4)
df <- data.frame(group=group, indic=c(x1, x2))
这是生成的数据帧:
df
group indic
1 A 0
2 A 0
3 A 0
4 A 1
5 A 1
6 A 1
7 A 0
8 A 0
9 B 0
10 B 1
11 B 0
12 B 1
13 B 0
14 B 1
15 B 0
16 B 1
indic==1
表示行是一个新子群的开始,该子群的编号应比前一个子群高1。其中indic==0
的子组应与前一个子组相同。子组编号从1开始。当group
变量发生变化时,子组编号将重置为1。我想使用tidyverse框架。这是我想要的结果:
df
group indic subgroup
1 A 0 1
2 A 0 1
3 A 0 1
4 A 1 2
5 A 1 3
6 A 1 4
7 A 0 4
8 A 0 4
9 B 0 1
10 B 1 2
11 B 0 2
12 B 1 3
13 B 0 3
14 B 1 4
15 B 0 4
16 B 1 5
我希望能够给出一些我已经尝试过但没有成功的方法,但我还没有找到任何接近的方法。任何帮助都将不胜感激。
您只需使用
library(dplyr)
df %>% group_by(group) %>%
mutate(subgroup=cumsum(indic)+1)
# group indic subgroup
# <fct> <dbl> <dbl>
# 1 A 0 1
# 2 A 0 1
# 3 A 0 1
# 4 A 1 2
# 5 A 1 3
# 6 A 1 4
# 7 A 0 4
# 8 A 0 4
# 9 B 0 1
# 10 B 1 2
# 11 B 0 2
# 12 B 1 3
# 13 B 0 3
# 14 B 1 4
# 15 B 0 4
# 16 B 1 5
我们使用dplyr
来进行分组,然后我们只使用cumsum
来获取indic
列的累积和,因此每次它看到1时,它都会增加。