我正在处理一个具有尺寸的数组。
我觉得通过使用向量化或某种并行处理方式,可能可以提高此代码的处理时间,但我无法找到解决方法。
有什么建议可以使这段代码更有效率吗?
[1] 290 259 55 4
针对最后三个维度的每次重复,我需要对第一个维度的290个元素进行滚动平均处理,将元素数量减少到289。最后,我需要创建一个包含更新值的数据框。
以下代码可以实现我需要的功能,但运行时间非常长(实际上,我不得不在结束之前中断它)。
library(zoo)
# Generate random data with same dimensions as mine
my.array <- array(1:16524200, dim=c(290,259,55,4))
# Get dimension sizes
dim2 <- dim(my.array)[2]
dim3 <- dim(my.array)[3]
dim4 <- dim(my.array)[4]
# Pre-allocate data frame to be used within the loop
df2 <- data.frame()
# Loop over dimensions
for (i in 1:dim4) {
for (j in 1:dim3) {
for (k in 1:dim2) {
# Take rolling average
u <- rollapply(my.array[,k,j,i], 2, mean)
# Assemble data frame
df1 <- data.frame(time=i, level=j, lat=k, wind=u)
df2 <- rbind(df2, df1)
}
}
}
# Very slow, and uses only one machine core
我觉得通过使用向量化或某种并行处理方式,可能可以提高此代码的处理时间,但我无法找到解决方法。
有什么建议可以使这段代码更有效率吗?
rbind
时,它都会将 整个数据框 复制到一个新的对象中并覆盖df2
。这可能对几十个数据点有效,但(正如您所看到的)它不具有可扩展性。 - r2evanssomething <- lapply(list_of_stuff, somefunc)
然后do.call(rbind, something)
(尽管这个问题需要更多的内容)。 - r2evans