【问题标题】:Speed up tapply R code加速 tapply R 代码
【发布时间】:2015-09-15 07:27:45
【问题描述】:

我有 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 分钟以上,这是不可行的。 关于如何提高计算速度有什么建议吗?

谢谢

【问题讨论】:

  • @zx8754 不确定它是否适用于此。 OP 想要mean(c1, c2, c3, c4, c5),然后是mean(c6,c7,c8,c9,10)
  • 总是显示你的代码,可能只是 for 循环是答案,但你犯了一个错误。
  • data.table(x=col, id=rep(1:(length(col)/10), each = 10))[,mean(x),id] col=sample(1:10, 604800*101, TRUE) 花费不到一秒
  • @Khashaa 但是col 不是矩阵,对吧?

标签: r performance runtime tapply


【解决方案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)])
}

【讨论】:

    【解决方案2】:

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

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2017-04-13
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多