我有矩阵A,我想创建矩阵B,其中:
第1列=矩阵A的第1列
第2列=两列的聚合,其中矩阵A的第1列与矩阵A中与其最相关的任何列聚合
第3列=三列的聚合,其中聚合结果(矩阵B的第2列)与其最相关的A列聚合(除了已经包含的矩阵A的列,这一列已经从矩阵A)中删除
等
我循环计算相关性,我计算每次迭代中的所有相关性。这适用于较低的r和n值(为简单起见,我在本例中选择了较低的值),但是对于较大的数据集需要很长时间。有更快/更有效的方法吗?优选地,我不必计算每次迭代中的所有相关性的方法。我尝试了bigcor()
之类的功能,但到目前为止还没有成功。
答案 0 :(得分:0)
将其移到for循环之外。它并不依赖i
:maxcor <- 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%......而且还有一份额外的数据副本A3 <- A2
,显然可以将其删除