Я пытаюсь лучше понять использование keyd data.table
s. После прочтения документации я думаю, что понял, как ускорить подмножество при использовании одной клавиши. Например:
DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9)
Вариант первый:
DT[x == "ad"]
Вариант второй:
setkey(DT,x)
DT["ad"]
В этом случае вариант один намного медленнее, чем вариант два, потому что таблица data.table использует ключ для более эффективного поиска (с использованием двоичного поиска по сравнению с векторным сканированием, которое я не понимаю, но я буду доверять, быстрее.)
В случае агрегирования подмножества данных с помощью оператора by, каков самый быстрый способ определить ключ? Должен ли я указать столбец, который я использую для подмножества данных, или столбец, определяющий группы? Например:
setkey(DT,x)
DT[!"bd",sum(v),by=y]
or
setkey(DT,y)
DT[!"bd",sum(v),by=y]
Есть ли способ использовать ключ как для x
, так и для y
?
ИЗМЕНИТЬ
При установке ключа на x
и y
выполняется поиск двух векторов? то есть:
setkey(DT,x,y)
РЕДАКТИРОВАТЬ2
Извините, я имел в виду спросить, будет ли вызов DT[!"bd",sum(v),by=y]
выполнять два бинарных сканирования, когда DT вводится как x, так и y?
setkey
сортирует все столбцы (начиная с последнего по первому), и поэтому по крайней мере как минимум выполняетnrows * num_keycols
операции - person eddi   schedule 14.11.2013data.table
. Я прочитал 10-минутное введение, FAQ и большую часть документации. Я также просматривал много ТАКИХ вопросов, но в целом я все еще чувствую себя неуверенно. - person dayne   schedule 15.11.2013x,y
, он просто выполнит один двоичный поиск!"bd"
части. Вby
выражении afaik нет бинарного поиска (там есть сортировка, которую иногда избегают, например, если вы сделалиby=x
, но не в этом случае). - person eddi   schedule 15.11.2013