【问题标题】:Add counter column for each group [duplicate]为每个组添加计数器列[重复]
【发布时间】:2020-09-08 06:12:13
【问题描述】:

我有一个这样的 data.table:

id       date
02 2020-08-27
02 2020-09-07
04 2020-08-27
07 2020-08-27
07 2020-08-27
19 2020-08-28
19 2020-09-07
19 2020-09-07

我想添加一个列,该列将基于每个id 中的date 组进行连续计数。因此,每个id 中日期最早的行将是1,然后是2 用于下一个较晚的日期,依此类推。

结果将如下所示:

id       date sequence
02 2020-08-27        1
02 2020-09-07        2
04 2020-08-27        1
07 2020-08-27        1
07 2020-08-27        1
19 2020-08-28        1
19 2020-09-07        2
19 2020-09-07        2

数据:

structure(list(id = c("02", "02", "04", "07", "07", "19", "19", 
                  "19"), date = structure(c(18501, 18512, 18501, 18501, 18501, 
                                            18502, 18512, 18512), class = "Date")), row.names = c(NA, -8L
                                            ), class = c("data.table", "data.frame"))

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以使用frank

    library(data.table)
    df1[, Sequence := frank(date, ties.method = 'dense'), id]
    df1
    #   id       date Sequence
    #1: 02 2020-08-27        1
    #2: 02 2020-09-07        2
    #3: 04 2020-08-27        1
    #4: 07 2020-08-27        1
    #5: 07 2020-08-27        1
    #6: 19 2020-08-28        1
    #7: 19 2020-09-07        2
    #8: 19 2020-09-07        2
    

    【讨论】:

    • 这似乎给出了基于第 n 行的 Seq,新日期出现在组中,而不是按顺序 1->2->3。请参阅更改第 7 行:df1[7, date:=as.Date("2020-08-28")] 并重新运行,Sequence 现在是 3 而不是 2
    • @moman822 它基于“日期”列的排名(这似乎是您所描述的问题)
    • @moman822 您可以将 ties.method 更改为 'dense'。如果相同的日期应该属于同一组
    • dense 工作,谢谢。 (我试图让“组中最早的日期”=1、“第二早”=2、“第三早”=3,依此类推。)
    • @moman822 在这种情况下,你可以使用-
    【解决方案2】:

    这是使用ave的基本R选项

    within(
      df,
      sequence <- ave(as.numeric(date), id, FUN = function(x) cumsum(Negate(duplicated)(x)))
    )
    

    给了

      id       date sequence
    1 02 2020-08-27        1
    2 02 2020-09-07        2
    3 04 2020-08-27        1
    4 07 2020-08-27        1
    5 07 2020-08-27        1
    6 19 2020-08-28        1
    7 19 2020-09-07        2
    8 19 2020-09-07        2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      相关资源
      最近更新 更多