Frage

Hinweis: Diese Frage und die folgenden Antworten beziehen sich auf data.table Versionen <1.5.3; V. 1.5.3 wurde im Februar 2011 veröffentlicht, um dieses Problem zu beheben sieht aktuellere Behandlung (03-2012). Translating verbindet SQL auf Fremdschlüssel R data.table Syntax


Ich habe für die Daten durch die Dokumentation gegraben. Tabelle Paket (Ersatz für data.frame, die viel effizienter für bestimmte Operationen ist), einschließlich Josh Reich Präsentation auf SQL und data.table am NYC R Meetup (pdf), kann aber nicht diese völlig triviale Operation herauszufinden.

> x <- DT(a=1:3, b=2:4, key='a')
> x
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
     a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
  a b c
1 1 2 a
2 2 3 b
3 3 4 c

Die docs sagen: „Wenn [das erste Argument] ist selbst ein data.table, eine Verknüpfung aufgerufen, ähnlich wie Base :: merge aber verwendet binäre Suche auf dem sortierten Schlüssel.“ Natürlich ist dies nicht der Fall. Kann ich die anderen Spalten von y in das Ergebnis von x [y] mit data.tables bekommen? Es scheint, wie es einfach ist, die Reihen von x nehmen, wo der Schlüssel den Schlüssel von y übereinstimmt, aber der Rest von y ganz ...

ignoriert
War es hilfreich?

Lösung

Sie sind unter Angabe des falschen Teil der Dokumentation. Wenn Sie einen Blick auf die doc von [.data.table haben Sie gelesen:

  

Wenn ich ein data.table ist, muss x haben eine   Schlüssel, was bedeutet, verbinden i x und zurück   die Zeilen in x, dass Spiel . Ein Equi-Join   ist zwischen jeder Spalte in i durchgeführt   jeder Spalte in Schlüssel des x um.   Dies ist ähnlich Basis R   Funktionalität von sub- eine Matrix Einstellung   von einer 2-Säulen-Matrix und in höheren   Abmessungen subsetting eine n-dimensionale   Array durch eine n-Spalten-Matrix

Ich gebe die Beschreibung des Pakets (der Teil, den Sie zitiert) ist etwas verwirrend, denn es scheint zu sagen, dass die „[“ -Betrieb statt merge verwendet werden kann. Aber ich denke, was sie sagt, ist:. Wenn x und y sind beide data.tables wir verwenden kommen auf einen Index (die wie merge aufgerufen wird) anstelle von binären Suche


Eine weitere Sache:

Die data.table Bibliothek, die ich über install.packages installiert fehlte die merge.data.table method, so merge mit merge.data.frame nennen würde. das Pakets von R-Forge R verwendet, um die schnelleren merge.data.table Verfahren nach der Installation.

Sie können überprüfen, ob Sie die merge.data.table Methode haben, indem die Ausgabe der Überprüfung:

methods(generic.function="merge")

EDIT [Antwort nicht mehr gültig]: Diese Antwort bezieht sich auf data.table Version 1.3. In Version 1.5.3 ist das Verhalten von data.table geändert und x [y] gibt die erwarteten Ergebnisse. Vielen Dank, dass Sie Matthew Dowle , Autor von data.table, für diesen Hinweis in den Kommentaren.

Andere Tipps

Danke für die Antworten. Ich vermisste diesen Thread, wenn es ursprünglich geschrieben wurde. data.table ist seit Februar weitergegangen. 1.4.1 wurde vor einer Weile auf CRAN veröffentlicht und 1.5 ist bald heraus. Zum Beispiel kann die DT () alias wurde mit list () ersetzt; als primitiv sein viel schneller, und data.table jetzt erbt von data.frame so dass es mit Paketen arbeitet, dass nur akzeptieren data.frame wie ggplot und Gitter, ohne Konvertierung erforderlich (schneller und bequeme ).

Ist es möglich, die data.table Tag zu abonnieren, damit ich eine E-Mail, wenn jemand Beiträge eine Frage mit diesem Tag bekommen? Die Datatable-Hilfe-Liste auf etwa 30-40 Nachrichten pro Monat gewachsen, aber ich bin glücklich, hier zu beantworten, wenn ich irgendeine Art von Meldung erhalten.

Matthew

Ich denke, mit der base::merge Funktion nicht benötigt wird, wie data.table Joins kann viel schneller sein. Z.B. finden Sie im folgenden. Ich mache x und y data.tables mit 3-3 Spalten:

x <- data.table( foo = 1:5, a=20:24, zoo = 5:1 )
y <- data.table( foo = 1:5, b=30:34, boo = 10:14)
setkey(x, foo)
setkey(y, foo)

Und fusionieren beide mit base:merge und data.table verbindet die Geschwindigkeit der Hinrichtung zu sehen:

system.time(merge(x,y))
##    user  system elapsed 
##   0.027   0.000   0.023 

system.time(x[,list(y,x)])
##    user  system elapsed 
##   0.003   0.000   0.006 

Die Ergebnisse sind nicht identisch, da diese eine zusätzliche Spalte:

merge(x,y)
##      foo  a zoo  b boo
## [1,]   1 20   5 30  10
## [2,]   2 21   4 31  11
## [3,]   3 22   3 32  12
## [4,]   4 23   2 33  13
## [5,]   5 24   1 34  14

x[,list(x,y)]
##      foo  a zoo foo.1  b boo
## [1,]   1 20   5     1 30  10
## [2,]   2 21   4     2 31  11
## [3,]   3 22   3     3 32  12
## [4,]   4 23   2     4 33  13
## [5,]   5 24   1     5 34  14

, die keine großen Schwierigkeiten machen könnte:)

ich denke, dass f3lix richtig ist und dass die Dokumentation ist ein wenig irreführend. Der Vorteil ist dabei ein schneller kommen Sie mit den Daten der Teilmenge. Sie noch schließlich die merge Funktion danach wie in Ihrem obigen Beispiel verwenden müssen.

Sie werden sehen, in Joshs Präsentation auf Daten mit .table dass dies, wie sein Beispiel läuft. Er erste Teilmengen eines der data.tables, dann tut eine Zusammenführung:

library(data.table)
sdt <- DT(series, key='series_id')
ddt <- DT(data, key='series_id')
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ]
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all']
data <- merge(d,series)[,c('title','min','mean','max')]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top