2013-10-18 31 views
10

Próbuję wykonać pełne łączenie kartezjańskie za pomocą data.table, ale przy odrobinie szczęścia.Kartezjański dołącz w data.table

Kod:


a = data.table(dt=c(20131017,20131018)) 
setkey(a,dt) 

b = data.table(ticker=c("ABC","DEF","XYZ"),ind=c("MISC1","MISC2","MISC3")) 
setkey(b,ticker) 

oczekiwany wynik:

merge(data.frame(a),data.frame(b),all.x=TRUE,all.y=TRUE) 

Próbowałem merge(a,b,allow.cartesian=TRUE) ale daje mi następujący błąd - "Error in merge.data.table(a, b, allow.cartesian = TRUE) : A non-empty vector of column names for przez is required."

Używam "R version 3.0.1 (2013-05-16)" z najnowszymi pakietami data.table. Każda pomoc będzie bardzo ceniona!

Pozdrowienia

+2

To wygląda bardziej jak 'problemu expand.grid' podobny niż' merge'-problemu. Nie masz wspólnej zmiennej. –

+0

Wymagane dane wyjściowe są uzyskiwane przez sprzężenie kartezjańskie za pomocą funkcji scalania, ale działa ona na data.frame i szukam rozwiązania data.table, jeśli jest to możliwe. – Manoj

+1

Zazwyczaj dodajemy zmienną atrapa, scalam przez tę zmienną i mam 'allow.cartesian = TRUE'. 'CJ' i' expand.grid' mogą krzyżować wektory sprzężenia, ale nigdy nie mogłem znaleźć funkcji bazowej, aby utworzyć połączenie krzyżowe dwóch tabel. Czy ktokolwiek może wskazać taką funkcję, jeśli istnieje? – TheComeOnMan

Odpowiedz

0

poszerzając @Codoremifa:

> dt <- c(20131017,20131018) 
> b <- data.table(ticker=c("ABC","DEF","XYZ"), ind=c("MISC1","MISC2","MISC3"), key="ticker") 
> b[CJ(ticker=ticker, dt=dt)][, c(3, 1, 2), with=F] 
     dt ticker ind 
1: 20131017 ABC MISC1 
2: 20131018 ABC MISC1 
3: 20131017 DEF MISC2 
4: 20131018 DEF MISC2 
5: 20131017 XYZ MISC3 
6: 20131018 XYZ MISC3 

Byłoby ładniej, jeśli pojedyncza komenda zrobi to, ale to jest stosunkowo proste.

19

Myślę, że lepszym rozwiązaniem jest:

a[,as.list(b),by=dt] 

     dt ticker ind 
1: 20131017 ABC MISC1 
2: 20131017 DEF MISC2 
3: 20131017 XYZ MISC3 
4: 20131018 ABC MISC1 
5: 20131018 DEF MISC2 
6: 20131018 XYZ MISC3 
+0

+1 sprytne rozwiązanie. – Arun

+0

Perfect - to dobry kumpel! – Manoj

+0

Jest to bardzo przydatne. Ja też nie mogłem połączyć się kartezjańsko do pracy. – drstevok