3 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果要通過data.table進(jìn)行操作,這是一種方法:
cjdt <- function(a,b){
cj = CJ(1:nrow(a),1:nrow(b))
cbind(a[cj[[1]],],b[cj[[2]],])
}
A = data.table(ida = 1:10)
B = data.table(idb = 1:10)
cjdt(A,B)
綜上所述,如果您進(jìn)行許多小連接,并且不需要data.table對(duì)象和產(chǎn)生對(duì)象的開銷,則可以通過c++使用Rcpp等編寫代碼塊來顯著提高速度:
// [[Rcpp::export]]
NumericMatrix crossJoin(NumericVector a, NumericVector b){
int szA = a.size(),
szB = b.size();
int i,j,r;
NumericMatrix ret(szA*szB,2);
for(i = 0, r = 0; i < szA; i++){
for(j = 0; j < szB; j++, r++){
ret(r,0) = a(i);
ret(r,1) = b(j);
}
}
return ret;
}
為了進(jìn)行比較,首先對(duì)于大型聯(lián)接:
C ++
n = 1
a = runif(10000)
b = runif(10000)
system.time({for(i in 1:n){
crossJoin(a,b)
}})
用戶系統(tǒng)運(yùn)行時(shí)間1.033 0.424 1.462
數(shù)據(jù)表
system.time({for(i in 1:n){
CJ(a,b)
}})
用戶系統(tǒng)經(jīng)過0.602 0.569 2.452
現(xiàn)在有很多小連接:
C ++
n = 1e5
a = runif(10)
b = runif(10)
system.time({for(i in 1:n){
crossJoin(a,b)
}})
用戶系統(tǒng)經(jīng)過的時(shí)間0.660 0.077 0.739
數(shù)據(jù)表
system.time({for(i in 1:n){
CJ(a,b)
}})
用戶系統(tǒng)已使用26.164 0.056 26.271
- 3 回答
- 0 關(guān)注
- 766 瀏覽
添加回答
舉報(bào)