Подтвердить что ты не робот

Подсчитайте количество записей и создайте номер строки в каждой группе в таблице данных.

У меня есть следующие данные. table

set.seed(1)
DT <- data.table(VAL = sample(c(1, 2, 3), 10, replace = TRUE))
    VAL
 1:   1
 2:   2
 3:   2
 4:   3
 5:   1
 6:   3
 7:   3
 8:   2
 9:   2
10:   1

Внутри каждого номера в VAL я хочу:

  • Подсчитайте количество записей/строк
  • Создать индекс строки (счетчик) первого, второго, третьего вхождения и т.д.

В конце я хочу получить результат

    VAL COUNT IDX
 1:   1     3   1
 2:   2     4   1
 3:   2     4   2
 4:   3     3   1
 5:   1     3   2
 6:   3     3   2
 7:   3     3   3
 8:   2     4   3
 9:   2     4   4
10:   1     3   3

где "COUNT" - количество записей/строк для каждого "VAL", а "IDX" - индекс строки в каждом "VAL".

Я попытался работать с which и length с помощью .I:

 dt[, list(COUNT = length(VAL == VAL[.I]), 
             IDX = which(which(VAL == VAL[.I]) == .I))]

но это не работает, так как .I относится к вектору с индексом, поэтому я предполагаю, что нужно использовать .I[]. Хотя внутри .I[] я снова сталкиваюсь с проблемой, что у меня нет индекса строки, и я знаю (из чтения data.table часто задаваемых вопросов и после сообщений здесь), что по возможности следует избегать чередования строк.

Итак, что за стиль data.table?

4b9b3361

Ответ 1

Использование .N...

DT[ , `:=`( COUNT = .N , IDX = 1:.N ) , by = VAL ]
#    VAL COUNT IDX
# 1:   1     3   1
# 2:   2     4   1
# 3:   2     4   2
# 4:   3     3   1
# 5:   1     3   2
# 6:   3     3   2
# 7:   3     3   3
# 8:   2     4   3
# 9:   2     4   4
#10:   1     3   3

.N - количество записей в каждой группе с группами, определенными "VAL".