2013-10-18 9 views
10

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(a,b,allow.cartesian=TRUE)を試してみました

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

- "Error in merge.data.table(a, b, allow.cartesian = TRUE) : A non-empty vector of column names foris required.による"

"R version 3.0.1 (2013-05-16)"と最新のdata.tableパッケージを使用しています。どんな助けでも大歓迎です! @Codoremifaに拡大

よろしく

+2

これは、より多くの 'expand.grid'のような問題のような' merge'-問題よりも見えます。あなたは共通の変数がありません。 –

+0

必要な出力は、マージ関数を使用したデカルト結合によって実現されますが、data.frameで動作します。可能であればdata.tableソリューションを探しています。 – Manoj

+1

私は通常、ダミー変数を追加し、その変数でマージし、 'allow.cartesian = TRUE'を持っています。 'CJ'と' expand.grid'はベクトルを交差することができますが、2つのテーブルのクロス結合を作成するための基本関数を見つけることはできません。もし誰かがそのような関数を指しているのであれば、それを指すことができますか? – TheComeOnMan

答えて

0

:単一のコマンドはそれを行うかどう

> 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 

は、よりよいだろうが、これは比較的簡単です。

19

私はよりよい解決策があると思う:

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巧妙な解決策。 – Arun

+0

パーフェクト - それはいい相手です! – Manoj

+0

これは非常に便利です。私も仕事にデカルト結合を得ることができませんでした。 – drstevok

関連する問題