Ответ 1
Я не уверен, что вы будете рассматривать это как элегантное, но как насчет:
DT[, COUNT := .N, by='SUBJECT,YEAR']
DT[, .SD[COUNT == max(COUNT)], by='YEAR']
Это, по сути, как применить by
к выражению i
, как @SenorO прокомментировал. Вам все равно понадобится [,COUNT:=NULL]
, но для одного временного столбца, а не для двух.
Мы не поощряем .SD
хотя и по соображениям скорости, но, надеюсь, скоро получим этот запрос функции, чтобы совет можно было отбросить: FR # 2330 Оптимизировать .SD [i] запрос, чтобы сохранить изящество, но сделать его более быстрым..
Другой подход заключается в следующем. Это быстрее и идиоматично, но может считаться менее элегантным.
# Create a small aggregate table first. No need to use := on the big table.
i = DT[, .N, by='SUBJECT,YEAR']
# Find the even smaller subset. (Do as much as we can on the small aggregate.)
i = i[, .SD[N==max(N)], by=YEAR]
# Finally join the small subset of key values to the big table
setkey(DT, YEAR, SUBJECT)
DT[i]
Нечто похожее на здесь.