2016-03-09 102 views
2

我有矩阵A,并且我想创建矩阵B,其中:汇总大矩阵

列矩阵的1 =列1的

柱2 =两列,的集合,其中矩阵的第1列A与与其最相关的矩阵A的列集合

第3列=三列的聚合,其中聚合结果(矩阵B的列2)与A最相关的A列聚合(除了矩阵A的列已经包括在内,这个已经从矩阵A中删除)

我循环计算相关性,其中我计算每次迭代中的所有相关性。这适用于较低的r和n值(为简单起见,本例中我选择了较低的值),但对于较大的数据集则需要很长的时间。有没有更快/更有效的方式来做到这一点?最好是一种方法,我不必计算每次迭代中的所有相关性。我已经尝试了bigcor()等功能,但目前尚未成功。

回答

1

将此移到for-loop之外。它不依赖于imaxcor <- names(which.max(sapply(A[,-1, drop=F], function(x) cor(A[, 1], x))))

r <- 10 # rows 
n <- 6 # columns 

library(microbenchmark) 
microbenchmark(OP = { 
    A <- data.frame(matrix(rnorm(r*n),nrow=r)) # original data frame 
    B <- data.frame(matrix(nrow=r,ncol=n)) # results 
    B[,1] <- A[,1] 
    for (i in 2:n) { 
    maxcor <- names(which.max(sapply(A[,-1, drop=F], function(x) cor(A[, 1], x)))) 
    B[,i] <- A[,1] + A[,maxcor] 
    A[,1] <- B[,i] 
    A[,maxcor] <- NULL 
    } 
}, 
ALEX= { 
    A2 <- data.frame(matrix(rnorm(r*n),nrow=r)) # original data frame 
    B2 <- data.frame(matrix(nrow=r,ncol=n)) # results 
    B2[,1] <- A2[,1] 
    A3 <- A2 
    maxcor <- sapply(A3[,-1, drop=F], function(x) cor(A3[, 1], x)) 
    cor_n <- names(A2)[order(maxcor, decreasing=T)] 
    for (i in 1:length(cor_n)) { 
    B2[,i+1] <- A2[,1] + apply(A2[,cor_n[1:i], drop= FALSE], 1, sum) 
    } 
}, times=100L) 


Unit: milliseconds 
expr  min  lq  mean median  uq  max neval cld 
    OP 1.779013 1.806192 1.915267 1.835082 1.941329 3.585394 100 b 
ALEX 1.229343 1.253102 1.386429 1.300428 1.377404 2.925868 100 a 

30%的性能提升......这与可明显被删除

+0

数据A3 <- A2的额外副本是如何将它放置在循环外当我不得不重复这个过程n-1次? – Joseph

+0

什么不清楚?我想更清楚地解释它。 – Joseph

+0

你想要做的背后的概念对我来说没有任何意义(统计)。但我想我现在可以理解编码问题了....让我调试并重写我的答案 –