按组提供订单号

时间:2019-01-31 02:00:51

标签: r data.table data-manipulation

我知道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 个答案:

答案 0 :(得分:3)

我的想法是保留对已分配的最大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值为[ID := .GRP, .(NAME, ST)]的新数据上应用相同的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