Man*_*noj 11 r 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)
Run Code Online (Sandbox Code Playgroud)
预期产量:
merge(data.frame(a),data.frame(b),all.x=TRUE,all.y=TRUE)
Run Code Online (Sandbox Code Playgroud)
我已经试过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套餐.任何帮助将不胜感激!
问候
Señ*_*r O 24
我认为更好的解决方案是:
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
Run Code Online (Sandbox Code Playgroud)
扩展@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)]
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
Run Code Online (Sandbox Code Playgroud)
如果用一个命令就能做到这一点会更好,但这相对简单。