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

Подмножество по группам с data.table

Предположим, у меня есть таблица данных, содержащая некоторых игроков в бейсбол:

library(plyr)
library(data.table)

bdt <- as.data.table(baseball)

Для каждого игрока (заданного id) я хочу найти строку, соответствующую году, в котором они играли в большинстве игр. Это просто в plyr:

ddply(baseball, "id", subset, g == max(g))

Что эквивалентный код для data.table?

Я пробовал:

setkey(bdt, "id") 
bdt[g == max(g)]  # only one row
bdt[g == max(g), by = id]  # Error: 'by' or 'keyby' is supplied but not j
bdt[, .SD[g == max(g)]] # only one row

Это работает:

bdt[, .SD[g == max(g)], by = id] 

Но он только на 30% быстрее, чем plyr, что говорит о том, что он, вероятно, не идиоматичен.

4b9b3361

Ответ 1

Здесь быстрый способ data.table:

bdt[bdt[, .I[g == max(g)], by = id]$V1]

Это позволяет избежать построения .SD, что является узким местом в ваших выражениях.

edit: На самом деле основная причина медленного OP заключается не только в том, что в нем есть .SD, а в том, что он использует его определенным образом - путем вызова [.data.table, который на данный момент имеет огромные накладные расходы, поэтому запуск его в цикле (когда один делает by) накапливает очень большой штраф.