我有一个非常高的整数矩阵(mat)和一个等长行的稀疏二进制向量(v)。我想在mat的所有列中找到最小值,其中v == 1。
以下是几种可能的解决方案:
mat <- matrix(as.integer(runif(100000*100,0,2^31)),nrow=100000,ncol=100)
v<-(rbinom(100000,1,.01))
a<-apply(v*mat,2, function(x) min(x[x>0]))
b<-apply(mat,2,function(x) min(x[v==1]))
c<-sapply(subset(data.frame(mat),v==1), min)
这些都很好,在我的机器上解决方案c似乎最快(一个老旧的,速度较慢的MacBook)。但是如果我有一个函数可以提供唯一的v集合,则计算时间会与集合的数量成线性关系。因此,大量独特集合(> 10,000)将需要数小时才能处理。
有关如何更快地完成此类操作的任何想法,还是我能够尽可能快地完成此操作?
答案 0 :(得分:1)
我认为,由于apply
几乎总是为0,因此子集化然后调用v
会获得很多收益:
system.time(b<-apply(mat[as.logical(v),],2, min))
# user system elapsed
# 0.012 0.000 0.013
system.time(a<-apply(v*mat,2, function(x) min(x[x>0])))
# user system elapsed
# 0.628 0.019 0.649
identical(a,b)
#[1] TRUE
我也放弃了x[x>0]
,因为mat
似乎总是大于0。