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 关注
- 739 浏览
添加回答
举报