加快tapply R代码
Speed up tapply R code
我有 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分钟以上,这是不可行的。
关于如何提高计算速度有什么建议吗?
谢谢
如果您对 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)])
}
或者没有 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
我有 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分钟以上,这是不可行的。 关于如何提高计算速度有什么建议吗?
谢谢
如果您对 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)])
}
或者没有 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