2013-11-14 2 views
7

Ich versuche, besser zu verstehen, mit Keyd data.table s. Nachdem ich die Dokumentation gelesen habe, verstehe ich, wie man das Subsetting bei Verwendung eines Schlüssels beschleunigt. Zum Beispiel:So definieren Sie data.table Schlüssel für die schnellste Aggregation mit mehreren Schlüsseln

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9) 

Option eins:

DT[x == "ad"] 

Option zwei:

setkey(DT,x) 
DT["ad"] 

In diesem Fall Option ist ein viel langsamer als Option zwei, weil die data.table den Schlüssel verwendet effizienter zu suchen (mit einer binären Suche im Vergleich zu einem Vektor-Scan, den ich nicht verstehe, aber ich vertraue, ist schneller.)

Wenn Sie eine Teilmenge der Daten mithilfe einer by-Anweisung aggregieren, was ist der schnellste Weg, den Schlüssel zu definieren? Sollte ich die Spalte, die ich verwende, um die Daten zu unterteilen, oder die Spalte, die die Gruppen definiert, eingeben? Zum Beispiel:

setkey(DT,x) 
DT[!"bd",sum(v),by=y] 

oder

setkey(DT,y) 
DT[!"bd",sum(v),by=y] 

Gibt es eine Möglichkeit sowohl einen Schlüssel für x und y zu nutzen?

EDIT

Ist der Schlüssel sowohl x Einstellung und y zwei Suchvektor durchführen? das heißt:

setkey(DT,x,y) 

EDIT2

Sorry, was ich bedeutete zu fragen war der Anruf DT[!"bd",sum(v),by=y] führen zwei binäre Scans, wenn DT von x und y verkeilt ist?

+1

vielleicht sind Sie für diese suchen: http://stackoverflow.com/a/15597713/817778 - ein warnenden Hinweis - Option ein ist * schneller * als Option 2, dh wenn Sie nur eine einzige Suche durchführen und noch keinen Schlüsselsatz haben, wird ein einfacher Vektor-Scan schneller sein – eddi

+0

@eddi Also ein Vektor-Scan ist schneller als den Schlüssel einstellen und dann die Suche durchführen? Mit anderen Worten, ich sollte keinen neuen Schlüssel setzen, bevor ich jede Suche nach einer neuen Spalte mache. Und ich sah die Antwort, auf die Sie verwiesen haben, aber ich war neugierig darauf, einen Schlüssel für das Argument i und einen anderen Schlüssel für die Zuweisung zu verwenden. – dayne

+0

, um Ihre Bearbeitung zu beantworten - 'setkey' sortiert alle Spalten (geht vom letzten zum ersten), und so am * am wenigsten * führt' nrows * num_keycols' Operationen aus – eddi

Antwort

1

Ich glaube, dass es nicht möglich ist, zwei binäre Scans durchzuführen, wenn die Datentabelle DT sowohl mit x als auch mit y codiert ist. Stattdessen würde ich die Keying wiederholen zuerst auf x und dann auf y wie folgt:

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] 
Verwandte Themen