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