【问题标题】:give different sequential number by column in r data.table [duplicate]在r data.table中按列给出不同的序列号[重复]
【发布时间】:2021-03-12 04:24:12
【问题描述】:

我想给 IDX 加上 id 和 day。

我尝试了.GRP ,.I ,seq_len(.N) 但无法得到正确答案。

dt[,IDX:=.GRP,by=c("id","day")] 

如果 id 和 day 相同,则给出相同的 IDX:

 no  id FIRST_DAY LAST_DAY       day IDX
 1:  46  20060912 20060922   10 days 1
 2: 116  20060921 20060923    0 days 2
 3:  46  20060922 20061001    0 days 3
 4:  46  20061001 20061014    0 days 3 
 5:  46  20070313 20070401 -150 days 4
 6:  46  20070401 20070501    0 days 3
 7:  46  20070501 20070601    0 days 3
 8:  46  20070601 20070613    0 days 3

但我想给出不同的 seq IDX,即使 id 和 day 相同。

 no  id FIRST_DAY LAST_DAY       day IDX
 1:  46  20060912 20060922   10 days 1
 2: 116  20060921 20060923    0 days 2
 3:  46  20060922 20061001    0 days 3
 4:  46  20061001 20061014    0 days 3 
 5:  46  20070313 20070401 -150 days 4
 6:  46  20070401 20070501    0 days 5
 7:  46  20070501 20070601    0 days 5
 8:  46  20070601 20070613    0 days 5

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    在这种情况下,您必须使用 run length encoding。为此data.table 在其包中有一个有用的函数rleid()。有了这个帮助,你的问题就会得到解决。

    dt[, IDX := rleid(id, day), ]
    > dt
        id FIRST_DAY LAST_DAY      day IDX
    1:  46  20060912 20060922   10days   1
    2: 116  20060921 20060923    0days   2
    3:  46  20060922 20061001    0days   3
    4:  46  20061001 20061014    0days   3
    5:  46  20070313 20070401 -150days   4
    6:  46  20070401 20070501    0days   5
    7:  46  20070501 20070601    0days   5
    8:  46  20070601 20070613    0days   5
    

    或使用baseR

    dt$IDX <- with(rle(paste(dt$id, dt$day)), rep(1:length(lengths), lengths))
    dt
    > dt
        id FIRST_DAY LAST_DAY       day IDX
    1:  46  20060912 20060922   10 days   1
    2: 116  20060921 20060923    0 days   2
    3:  46  20060922 20061001    0 days   3
    4:  46  20061001 20061014    0 days   3
    5:  46  20070313 20070401 -150 days   4
    6:  46  20070401 20070501    0 days   5
    7:  46  20070501 20070601    0 days   5
    8:  46  20070601 20070613    0 days   5
    

    使用的输入

    dt <- structure(list(id = c(46L, 116L, 46L, 46L, 46L, 46L, 46L, 46L
    ), FIRST_DAY = c(20060912L, 20060921L, 20060922L, 20061001L, 
    20070313L, 20070401L, 20070501L, 20070601L), LAST_DAY = c(20060922L, 
    20060923L, 20061001L, 20061014L, 20070401L, 20070501L, 20070601L, 
    20070613L), day = c("10days", "0days", "0days", "0days", "-150days", 
    "0days", "0days", "0days")), row.names = c(NA, -8L), class = c("data.table", 
    "data.frame"), .internal.selfref = <pointer: 0x00000222e2b81ef0>
    
        id FIRST_DAY LAST_DAY      day
    1:  46  20060912 20060922   10days
    2: 116  20060921 20060923    0days
    3:  46  20060922 20061001    0days
    4:  46  20061001 20061014    0days
    5:  46  20070313 20070401 -150days
    6:  46  20070401 20070501    0days
    7:  46  20070501 20070601    0days
    8:  46  20070601 20070613    0days
    

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2021-07-23
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2019-08-28
      相关资源
      最近更新 更多