首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速tapply R码

加速tapply R码
EN

Stack Overflow用户
提问于 2015-09-15 07:27:45
回答 2查看 294关注 0票数 1

我有100个矩阵,每个矩阵有604800列,101个行。对于每个矩阵,我需要通过计算10列平均数将列数减少到60480。

例如,对于向量

代码语言:javascript
复制
c(1,2,3,4,5,6,7,8,9,10,...)

5栏平均数为:

代码语言:javascript
复制
c(3,8,13,18,...)

我使用的代码是:

代码语言:javascript
复制
col.av = tapply(col, rep(1:(length(col)/10), each = 10), mean)

其中col是我的101个x 604800矩阵之一。我有一个for循环,它迭代100个矩阵,但是我的问题是计算一次运行所需的时间长度。

如果我只是使用一个矩阵,它需要20 minutes+来执行,这是不可行的。对于如何提高计算速度,有什么建议吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-15 07:47:56

如果您对for循环很满意,则此循环适用于您的情况:

代码语言:javascript
复制
col.av <- matrix(0, nrow(col), ncol(col)/10)
for (i in 1:ncol(col.av)) {
  col.av[,i] <- rowMeans(col[,(10*(i-1)+1):(10*i)])
}
票数 1
EN

Stack Overflow用户

发布于 2015-09-15 07:54:56

或者没有for -循环和自定义的可读性函数。您可以始终在for-循环或应用的调用中将其包装起来。

代码语言:javascript
复制
#generate data
nc=604800 
nr=101
test_m <- matrix(rnorm(nc*nr),ncol=nc)

#function to get rowmeans by 'window'-columns
get_rowmeans <- function(mm, window=10){
  indices <- seq(1,ncol(mm),by=window)
  res <- sapply(indices, function(i){
    return(rowMeans(mm[,i:(i+(window-1))]))
  })
  res
}

tt <- get_rowmeans(test_m)
#check one
> all(tt[,1]==rowMeans(test_m[,1:10]))
[1] TRUE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32580139

复制
相关文章

相似问题

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