我有一个如下所示的数据矩阵:
> df[1:5,1:5]
OTU_97.30326 OTU_97.44566 OTU_97.44134 OTU_97.45188 OTU_97.31247 ...
700114712 0.0001197605 0.0003592814 0.0001197605 0.0001197605 0.0043113772
700114713 0.0001236400 0.0001236400 0.0001236400 0.0001236400 0.0001236400
700114554 0.0001245795 0.0001245795 0.0001245795 0.0001245795 0.0001245795
700114606 0.0001282380 0.0001282380 0.0001282380 0.0001282380 0.0001282380
700114335 0.0002158662 0.0009713977 0.0005396654 0.0001079331 0.0024824609
...
我还有一个矩阵,它将我需要计算的几何平均值与上表的列相关联。
> sbp[1:5,1:7]
n1 n2 n3 n4 n5 n6 n7...
OTU_97.30326 1 1 1 1 1 1 1
OTU_97.44566 1 1 1 1 1 1 1
OTU_97.44134 1 1 1 1 1 1 1
OTU_97.45188 1 1 1 0 1 1 0
OTU_97.31247 1 1 1 -1 1 0 1
...
两者的大小约为4000乘4000。
对于每列n *,我需要计算第一个矩阵的几何平均值的方差(按行),即,沿着这样的行:
x <- which(sbp[,'n1']==1)
var(geometricMeanRows(df[,x]))
问题是我上面写的内容太慢而无法使用。关于如何提高速度的任何建议?
注意(如果有帮助):每个n *对应于二叉树内部节点的符号代码。这是sbp [,&#39; n1&#39;]给出一个向量,其中所有从内部节点下降的提示&#39; n1&#39;如果它们是从n1的右或左子树下降,则标记为+1或-1,如果它不是后代,则标记为0。
答案 0 :(得分:3)
我将使用软件包 Rfast 来加快代码的速度。
colGeomMean <- function(x) Rfast::colprods(x,method="expsumlog")^(1/nrow(x))
x <- which(sbp[,'n1']==1)
Rfast::Var(colGeomMean(df[,x]))
以下是一些功能 Rfast :: Var
的基准x=rnorm(4000)
microbenchmark::microbenchmark(Rfast=a<-Rfast::Var(x),R=b<-var(x),times = 10)
Unit: microseconds
expr min lq mean median uq max neval
Rfast 14.369 15.190 19.5417 16.627 19.296 43.927 10
R 59.938 62.401 85.0214 68.149 99.349 167.497 10
a==b
[1] TRUE
还有一个使用for循环的示例
x=rnorm(4000)
microbenchmark::microbenchmark(
Rfast=for(i in 1:1000) a<-Rfast::Var(x),R=for(i in 1:1000) b<-var(x),times = 10)
Unit: milliseconds
expr min lq mean median uq max neval
Rfast 16.56490 16.93438 20.27926 17.11994 18.57527 44.03719 10
R 66.97311 73.90082 105.52192 87.81862 132.33613 207.79121 10
a==b
[1] TRUE
R没有 colprods ,因此 colGeomMean 将比对每个列应用 prod 更快。您可以将其与您的进行比较。 最好使用method =“ expsumlog”进行协作。它比脱脂慢,但更安全。 最后, Rfast 具有 colVars 功能,该功能可能会有用。