Декартово соединение в data.table - программирование
Подтвердить что ты не робот

Декартово соединение в data.table

Я пытаюсь сделать полное декартово объединение, используя data.table, но с небольшой удачей.

Код:


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)

Ожидаемый результат:

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

Я пробовал merge(a,b,allow.cartesian=TRUE), но он дает мне следующую ошибку: "Error in merge.data.table(a, b, allow.cartesian = TRUE) : A non-empty vector of column names for на is required."

Я использую "R version 3.0.1 (2013-05-16)" с последними пакетами data.table. Любая помощь будет принята с благодарностью!

Привет

4b9b3361

Ответ 1

Я думаю, что лучшее решение:

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

Ответ 2

Расширение на @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

Было бы лучше, если бы одна команда сделала это, но это относительно просто.