Дать номер заказа по группе - PullRequest
0 голосов
/ 31 января 2019

Я знаю, что пакет 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 голосов
/ 31 января 2019

Моя идея состоит в том, чтобы сохранить ссылку на уже назначенное максимальное значение идентификатора, а затем использовать ее для ДОБАВЛЕНИЯ новых значений .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
...