data.table “ключевые индексы” или “групповой счетчик”

После создания ключа на data.table:

set.seed(12345) DT <- data.table(x = sample(LETTERS[1:3], 10, replace = TRUE), y = sample(LETTERS[1:3], 10, replace = TRUE)) setkey(DT, x, y) DT # xy # [1,] AB # [2,] AB # [3,] BB # [4,] BB # [5,] CA # [6,] CA # [7,] CA # [8,] CA # [9,] CC # [10,] CC 

Я хотел бы получить целочисленный вектор, дающий для каждой строки соответствующий «ключевой индекс». Я надеюсь, что ожидаемый результат (столбец i ) ниже поможет прояснить, что я имею в виду:

 # xyi # [1,] AB 1 # [2,] AB 1 # [3,] BB 2 # [4,] BB 2 # [5,] CA 3 # [6,] CA 3 # [7,] CA 3 # [8,] CA 3 # [9,] CC 4 # [10,] CC 4 

Я думал об использовании чего-то вроде cumsum(!duplicated(DT[, key(DT), with = FALSE])) но я надеюсь, что есть лучшее решение. Я чувствую, что этот вектор может быть частью внутреннего представления таблицы, и, возможно, есть способ получить к нему доступ? Даже если это не так, что бы вы предложили?

Обновление: из v1.8.3 вы можете просто использовать встроенный специальный .GRP :

 DT[ , i := .GRP, by = key(DT)] 

См. Историю более старых ответов.

Я бы просто сделал это, так как я уверен, что индексный счетчик доступен из вызова [.data.table() :

 ii <- unique(DT) ii[ , i := seq_len(nrow(ii))] DT[ii] # xyi # 1: AB 1 # 2: AB 1 # 3: BB 2 # 4: BB 2 # 5: CA 3 # 6: CA 3 # 7: CA 3 # 8: CA 3 # 9: CC 4 # 10: CC 4 

Вы можете сделать это одним лайнером, за счет дополнительного вызова unique.data.table() :

 DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]] 
  • Укажите пользовательский формат даты для аргумента colClasses в read.table / read.csv
  • В чем разница между `=` и `<-` в R?
  • Существует ли компилятор R?
  • стандартная оценка в dplyr: summaryise_ по переменной, заданной как строка символов
  • Примеры опасностей глобальных переменных в R и Stata
  • Как сгладить список в список без принуждения?
  • Как установить размер для локального изображения с помощью knitr для уценки?
  • Создание регулярных 15-минутных временных рядов из нерегулярных временных рядов
  • Преобразование точек широты и долготы в UTM
  • mutate_each / summaryise_each в dplyr: как я могу выбрать определенные столбцы и дать новые имена мутированным столбцам?
  • Понимание функции order ()
  • Давайте будем гением компьютера.