如何在R中交叉加入?

如何在R中实现交叉联接?我知道“合并”可以进行内部联接,外部联接。但是我不知道如何在R中实现交叉联接。



慕村225694
浏览 692回答 3
3回答

潇潇雨雨

如果要通过data.table进行操作,这是一种方法:cjdt <- function(a,b){&nbsp; cj = CJ(1:nrow(a),1:nrow(b))&nbsp; 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){&nbsp; int szA = a.size(),&nbsp;&nbsp; &nbsp; &nbsp; szB = b.size();&nbsp; int i,j,r;&nbsp; NumericMatrix ret(szA*szB,2);&nbsp; for(i = 0, r = 0; i < szA; i++){&nbsp; &nbsp; for(j = 0; j < szB; j++, r++){&nbsp; &nbsp; &nbsp; ret(r,0) = a(i);&nbsp; &nbsp; &nbsp; ret(r,1) = b(j);&nbsp; &nbsp; }&nbsp; }&nbsp; return ret;}为了进行比较,首先对于大型联接:C ++n = 1a = runif(10000)b = runif(10000)system.time({for(i in 1:n){&nbsp; crossJoin(a,b)}})用户系统运行时间1.033 0.424 1.462数据表system.time({for(i in 1:n){&nbsp; CJ(a,b)}})用户系统经过0.602 0.569 2.452现在有很多小连接:C ++n = 1e5a = runif(10)b = runif(10)system.time({for(i in 1:n){&nbsp; crossJoin(a,b)}})用户系统经过的时间0.660 0.077 0.739数据表system.time({for(i in 1:n){&nbsp; CJ(a,b)}})用户系统已使用26.164 0.056 26.271
打开App,查看更多内容
随时随地看视频慕课网APP