首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合大矩阵

聚合大矩阵
EN

Stack Overflow用户
提问于 2016-03-09 18:02:53
回答 1查看 67关注 0票数 2

我有矩阵A,我想创建矩阵B,其中:

第1栏=矩阵A的第1栏

第2列=两列的聚合,其中矩阵A的第1列与矩阵A中最相关的列聚合在一起

第3列=三列的聚合,其中聚合结果(矩阵B的第2列)与A的任何一列关联最大(除已包含的矩阵A列外,此列已从矩阵A中删除)

等。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-09 18:30:59

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

代码语言:javascript
复制
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副本,显然可以删除

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35899180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档