【发布时间】:2020-04-12 14:27:04
【问题描述】:
我正在处理具有维度的数组
[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
我觉得可以通过使用矢量化甚至某种并行性来改善这段代码的处理时间,但我不知道如何。
有什么建议可以让这段代码更高效吗?
【问题讨论】:
-
永远不要迭代地构建 data.frames。每次调用
rbind时,它都会将整个帧 复制到一个新对象中并覆盖df2。它可能适用于几十个,但是(如您所见)这可怕地。 -
@r2evans 说得通,但是......还有什么替代方案?
-
一般来说,
something <- lapply(list_of_stuff, somefunc),然后是do.call(rbind, something)(虽然这个问题需要多一点)。
标签: r performance for-loop multidimensional-array