我的想法是保持对已经分配的最大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