Моя идея состоит в том, чтобы сохранить ссылку на уже назначенное максимальное значение идентификатора, а затем использовать ее для ДОБАВЛЕНИЯ новых значений .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.table, исходная dt
и новая dt1
.Мы можем объединить их вместе, чтобы поместить исходные значения идентификатора в dt1
.
## Attach the original ID values
dt1[
dt
, on = c("YEAR", "NAME", "ST")
, ID := ID
]
Обновление значений идентификатора
Затем мы можем применить тот же [ID := .GRP, .(NAME, ST)]
к этим новым данным, где идентификаторзначение равно NA
, и добавить максимальный идентификатор из исходных данных
## 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