潇潇雨雨
如果要通过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 = 1a = 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 = 1e5a = 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