3 回答

TA貢獻1833條經驗 獲得超4個贊
如果要通過data.table進行操作,這是一種方法:
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)
綜上所述,如果您進行許多小連接,并且不需要data.table對象和產生對象的開銷,則可以通過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;
}
為了進行比較,首先對于大型聯接:
C ++
n = 1
a = runif(10000)
b = runif(10000)
system.time({for(i in 1:n){
crossJoin(a,b)
}})
用戶系統運行時間1.033 0.424 1.462
數據表
system.time({for(i in 1:n){
CJ(a,b)
}})
用戶系統經過0.602 0.569 2.452
現在有很多小連接:
C ++
n = 1e5
a = runif(10)
b = runif(10)
system.time({for(i in 1:n){
crossJoin(a,b)
}})
用戶系統經過的時間0.660 0.077 0.739
數據表
system.time({for(i in 1:n){
CJ(a,b)
}})
用戶系統已使用26.164 0.056 26.271
- 3 回答
- 0 關注
- 768 瀏覽
添加回答
舉報