加快tapply R代码

时间:2015-09-15 07:27:46

标签: r performance runtime tapply

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

例如,对于矢量

c(1,2,3,4,5,6,7,8,9,10,...)

5列平均值为:

c(3,8,13,18,...)

我用来执行此操作的代码是:

col.av = tapply(col, rep(1:(length(col)/10), each = 10), mean)

col是我的101 x 604800矩阵之一。我有一个for循环遍历100个矩阵,但我的问题在于计算一次运行所需的时间长度。

如果我只使用一个矩阵,则需要20分钟+才能执行,这是不可行的。 关于如何提高计算速度,有什么建议吗?

由于

2 个答案:

答案 0 :(得分:1)

如果您对for循环没问题,那么这个适用于您的情况:

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 :(得分:0)

或者没有for-loop和自定义函数以提高可读性。您始终可以将其包含在for-loop或要应用的调用中。

#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