代码之家  ›  专栏  ›  技术社区  ›  Peter Chen

按组给出订单号

  •  1
  • Peter Chen  · 技术社区  · 5 年前

    我知道 data.table 包包含参数 .GRP 按组给出订单号。但是,如果我不希望订单号从1开始,怎么办?

    # dt
    YEAR   NAME   ST
    2010   AAA    AK
    2011   AAA    AK
    2012   AAA    AK
    2010   BBB    AL
    2011   BBB    AL
    2010   CCC    CA
    
    dt[, ID := .GRP, .(NAME, ST)]
    
    YEAR   NAME   ST    ID
    2010   AAA    AK     1 
    2011   AAA    AK     1
    2012   AAA    AK     1
    2010   BBB    AL     2
    2011   BBB    AL     2
    2010   CCC    CA     3
    

    现在,我清楚地解释了我的问题。
    如果我在其中添加新的许多新的观察结果。如何添加 ID 上一个的数字。

    YEAR   NAME   ST    ID
    2010   AAA    AK     1 
    2011   AAA    AK     1
    2012   AAA    AK     1
    2010   BBB    AL     2
    2011   BBB    AL     2
    2010   CCC    CA     3
    2010   DDD    LA     
    2011   DDD    LA    
    2015   DDD    LA    
    2016   DDD    LA    
    2010   EEE    GA    
    2011   EEE    GA    
    2014   FFF    PA     
    
    
    YEAR   NAME   ST    ID
    2010   AAA    AK     1 
    2011   AAA    AK     1
    2012   AAA    AK     1
    2010   BBB    AL     2
    2011   BBB    AL     2
    2010   CCC    CA     3
    2010   DDD    LA     4
    2011   DDD    LA     4
    2015   DDD    LA     4
    2016   DDD    LA     4
    2010   EEE    GA     5
    2011   EEE    GA     5
    2014   FFF    PA     6
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   SymbolixAU Adam Erickson    5 年前

    我的想法是保持对已经分配的最大ID值的引用,然后使用它添加到新的.grp值中。下面是一个例子

    设置数据

    library(data.table)
    
    dt <- fread('YEAR   NAME   ST
    2010   AAA    AK
    2011   AAA    AK
    2012   AAA    AK
    2010   BBB    AL
    2011   BBB    AL
    2010   CCC    CA')
    
    ## Assign GRP IDs
    dt[, ID := .GRP, .(NAME, ST)]
    
    ## New data
    dt1 <- fread('YEAR   NAME   ST
    2010   AAA    AK
    2011   AAA    AK
    2012   AAA    AK
    2010   BBB    AL
    2011   BBB    AL
    2010   CCC    CA
    2010   DDD    LA
    2011   DDD    LA
    2015   DDD    LA
    2016   DDD    LA
    2010   EEE    GA
    2011   EEE    GA
    2014   FFF    PA ')
    

    现在我们有两个data.tables,原始的 dt 一个新的 dt1 . 我们可以将它们连接在一起,将原始ID值放到 DT1 .

    ## Attach the original ID values
    dt1[
      dt
      , on = c("YEAR", "NAME", "ST")
      , ID := ID
    ]
    

    更新ID值

    那么我们也可以用同样的方法 [ID := .GRP, .(NAME, ST)] 在ID值为的新数据上 NA ,并从原始数据中添加最大ID

    ## set the order so the NAs are at the bottom 
    setorder(dt1, ST, NAME, YEAR, ID)
    
    ## keep a reference to the maximum Id already assigned, then add it to tne new groups
    maxId <- max(dt1$ID, na.rm = T)
    dt1[is.na(ID), ID := .GRP + maxId, .(NAME, ST) ]
    
    dt1
    #     YEAR NAME ST ID
    # 1:  2010  AAA AK  1
    # 2:  2011  AAA AK  1
    # 3:  2012  AAA AK  1
    # 4:  2010  BBB AL  2
    # 5:  2011  BBB AL  2
    # 6:  2010  CCC CA  3
    # 7:  2010  EEE GA  4
    # 8:  2011  EEE GA  4
    # 9:  2010  DDD LA  5
    # 10: 2011  DDD LA  5
    # 11: 2015  DDD LA  5
    # 12: 2016  DDD LA  5
    # 13: 2014  FFF PA  6