【问题标题】:Enumerate groups within groups in a data.table [duplicate]枚举data.table中组内的组[重复]
【发布时间】:2019-06-21 12:02:42
【问题描述】:

这与多个重复项(123)有关,但我遇到的问题略有不同。到目前为止,我只见过熊猫solution

在这个数据表中:

dt = data.table(gr = rep(letters[1:2], each = 6), 
                cl = rep(letters[1:4], each = 3))

    gr cl
 1:  a  a
 2:  a  a
 3:  a  a
 4:  a  b
 5:  a  b
 6:  a  b
 7:  b  c
 8:  b  c
 9:  b  c
10:  b  d
11:  b  d
12:  b  d

我想枚举每个组的唯一类以获得此:

    gr cl id
 1:  a  a  1
 2:  a  a  1
 3:  a  a  1
 4:  a  b  2
 5:  a  b  2
 6:  a  b  2
 7:  b  c  1
 8:  b  c  1
 9:  b  c  1
10:  b  d  2
11:  b  d  2
12:  b  d  2

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    试试

    library(data.table)
    dt[, id := rleid(cl), by=gr]
    dt
    #    gr cl id
    # 1:  a  a  1
    # 2:  a  a  1
    # 3:  a  a  1
    # 4:  a  b  2
    # 5:  a  b  2
    # 6:  a  b  2
    # 7:  b  c  1
    # 8:  b  c  1
    # 9:  b  c  1
    #10:  b  d  2
    #11:  b  d  2
    #12:  b  d  2
    

    【讨论】:

    • 就是这样!不知道rleid...
    【解决方案2】:

    您可以这样做(可能需要先对数据进行排序):

    dt[, id := cumsum(!duplicated(cl)), by = gr]
    
        gr cl id
     1:  a  a  1
     2:  a  a  1
     3:  a  a  1
     4:  a  b  2
     5:  a  b  2
     6:  a  b  2
     7:  b  c  1
     8:  b  c  1
     9:  b  c  1
    10:  b  d  2
    11:  b  d  2
    12:  b  d  2
    

    dplyr:

    dt %>%
     group_by(gr) %>%
     mutate(id = cumsum(!duplicated(cl)))
    

    或者类似rleid()的可能性:

    dt %>%
     group_by(gr) %>%
     mutate(id = with(rle(cl), rep(seq_along(lengths), lengths)))
    

    【讨论】:

    • cumsum 的有趣解决方案
    【解决方案3】:

    使用factor 的替代解决方案不需要先订购

    dt %>%
      group_by(gr) %>%
      mutate(id = as.numeric(factor(cl))) %>%
      ungroup()
    
    # # A tibble: 12 x 3
    #   gr    cl       id
    #   <chr> <chr> <dbl>
    # 1 a     a         1
    # 2 a     a         1
    # 3 a     a         1
    # 4 a     b         2
    # 5 a     b         2
    # 6 a     b         2
    # 7 b     c         1
    # 8 b     c         1
    # 9 b     c         1
    #10 b     d         2
    #11 b     d         2
    #12 b     d         2
    

    请注意,这将根据 cl 值的字母顺序在每个 gr 组内自动分配一个数字/ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多