代码之家  ›  专栏  ›  技术社区  ›  TarJae

如何增加非连续重复组

  •  3
  • TarJae  · 技术社区  · 2 年前

    我该如何计算 col2 ?

    col2 中的值每次都应递增 col1 在被不同的值打断后出现,例如创建一个分组变量,该变量在每次新序列开始时都会发生变化。

    structure(list(col1 = c("A", "A", "A", "A", "B", "B", "B", "C", 
    "C", "C", "C", "A", "A", "E", "E", "E", "F", "F", "F", "G", "G", 
    "G", "C", "C", "C", "A", "A", "A"), col2 = c(1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L)), class = "data.frame", row.names = c(NA, 
    -28L))
    

    所需输出:

       col1 col2
    1     A    1
    2     A    1
    3     A    1
    4     A    1
    5     B    1
    6     B    1
    7     B    1
    8     C    1
    9     C    1
    10    C    1
    11    C    1
    12    A    2
    13    A    2
    14    E    1
    15    E    1
    16    E    1
    17    F    1
    18    F    1
    19    F    1
    20    G    1
    21    G    1
    22    G    1
    23    C    2
    24    C    2
    25    C    2
    26    A    3
    27    A    3
    28    A    3
    
    2 回复  |  直到 2 年前
        1
  •  4
  •   stefan    2 年前

    一种选择是使用 consecutive_id 有两次是这样的:

    library(dplyr, warn = FALSE)
    
    df |>
      select(-col2) |>
      mutate(col2 = consecutive_id(col1)) |>
      mutate(col2 = consecutive_id(col2), .by = col1)
    #>    col1 col2
    #> 1     A    1
    #> 2     A    1
    #> 3     A    1
    #> 4     A    1
    #> 5     B    1
    #> 6     B    1
    #> 7     B    1
    #> 8     C    1
    #> 9     C    1
    #> 10    C    1
    #> 11    C    1
    #> 12    A    2
    #> 13    A    2
    #> 14    E    1
    #> 15    E    1
    #> 16    E    1
    #> 17    F    1
    #> 18    F    1
    #> 19    F    1
    #> 20    G    1
    #> 21    G    1
    #> 22    G    1
    #> 23    C    2
    #> 24    C    2
    #> 25    C    2
    #> 26    A    3
    #> 27    A    3
    #> 28    A    3
    
        2
  •  2
  •   ThomasIsCoding    2 年前

    基本R选项使用 rle + ave

    transform(
      df,
      col3 = with(
        rle(col1),
        rep(ave(seq_along(values), values, FUN = seq_along), lengths)
      )
    )
    

    给予

       col1 col2 col3
    1     A    1    1
    2     A    1    1
    3     A    1    1
    4     A    1    1
    5     B    1    1
    6     B    1    1
    7     B    1    1
    8     C    1    1
    9     C    1    1
    10    C    1    1
    11    C    1    1
    12    A    2    2
    13    A    2    2
    14    E    1    1
    15    E    1    1
    16    E    1    1
    17    F    1    1
    18    F    1    1
    19    F    1    1
    20    G    1    1
    21    G    1    1
    22    G    1    1
    23    C    2    2
    24    C    2    2
    25    C    2    2
    26    A    3    3
    27    A    3    3
    28    A    3    3
    
    推荐文章