2013-10-18 43 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(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 foris required.

我正在使用“R version 3.0.1 (2013-05-16)”包含最新的data.table包。任何帮助将不胜感激!

问候

+2

这看起来更像是一个比'merge'-问题的'expand.grid'样的问题。你没有共同的变量。 –

+0

所需的输出是通过使用合并函数的笛卡尔连接实现的,但它适用于data.frame,如果可能的话,我正在寻找data.table解决方案。 – Manoj

+1

我通常会添加一个虚拟变量,通过该变量进行合并,并具有'allow.cartesian = TRUE'。 'CJ'和'expand.grid'可以交叉连接矢量,但我永远找不到一个基本函数来创建两个表的交叉连接。任何人都可以指出这样的功能,如果它存在? – TheComeOnMan

回答

0

扩展在@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 

会更好,如果一个命令将做到这一点,但这是相对比较简单。

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