Как определить ключи data.table для максимально быстрого агрегирования с использованием нескольких ключей

Я пытаюсь лучше понять использование keyd data.tables. После прочтения документации я думаю, что понял, как ускорить подмножество при использовании одной клавиши. Например:

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?


person dayne    schedule 14.11.2013    source источник
comment
возможно, вы ищете это: stackoverflow.com/a/15597713/817778 - предупреждение - вариант первый: < i> быстрее, чем вариант два, т.е. если все, что вы делаете, - это один поиск и еще не заданы ключи, простое векторное сканирование будет быстрее   -  person eddi    schedule 14.11.2013
comment
@eddi Значит, векторное сканирование быстрее, чем установка ключа и последующий поиск? Другими словами, я не должен устанавливать новый ключ перед каждым поиском в новом столбце? И я видел ответ, на который вы ссылались, но мне было любопытно использовать один ключ для аргумента i и другой ключ для присваивания по.   -  person dayne    schedule 14.11.2013
comment
для ответа на ваше редактирование - setkey сортирует все столбцы (начиная с последнего по первому), и поэтому по крайней мере как минимум выполняет nrows * num_keycols операции   -  person eddi    schedule 14.11.2013
comment
@eddi Простите за путаницу. Я все еще привыкаю к ​​новому словарю и все еще пытаюсь понять, как наиболее эффективно использовать пакет data.table. Я прочитал 10-минутное введение, FAQ и большую часть документации. Я также просматривал много ТАКИХ вопросов, но в целом я все еще чувствую себя неуверенно.   -  person dayne    schedule 15.11.2013
comment
np; re edit2: если ключ x,y, он просто выполнит один двоичный поиск !"bd" части. В by выражении afaik нет бинарного поиска (там есть сортировка, которую иногда избегают, например, если вы сделали by=x, но не в этом случае).   -  person eddi    schedule 15.11.2013


Ответы (1)


Я считаю, что невозможно выполнить два двоичных сканирования, когда таблица данных DT имеет ключи как x, так и y. Вместо этого я бы повторил ввод сначала по x, а затем по y следующим образом:

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=as.character(c(1,3,4)), v=1:9)
setkey(DT,x)
tmp = DT[!"bd"]
setkey(tmp,y)
tmp[!"1",sum(v),by=y]
person MasterJedi    schedule 25.08.2014