【问题标题】:Assign sequential group ID given a group start indicator在给定组开始指示符的情况下分配顺序组 ID
【发布时间】:2020-06-03 04:56:32
【问题描述】:

在给定组 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

我希望能够提供一些我已经尝试过但没有奏效的方法,但我什至找不到任何接近的方法。任何帮助将不胜感激。

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    你可以使用

    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 时它都会增加。

    【讨论】:

    • 如果组以1 开头怎么办?那么结果不是从2 开始吗?
    • 好点。我不确定如果该组以 1 开头会发生什么。与其添加 1,我可以始终让 1 成为每个组的第一个 Indic。
    • 好的,听起来不错。听起来很简单,肯定有问题;-) 谢谢,MrFlick!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2017-05-23
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多