r语言 - 应用特定函数时如何加快大型数据集上的行操作



我正在使用R中的大数据帧。我的数据帧是Q的,我在代码中包含类似的结构。它有 250.000 行和 1000 列。我的目标是为每一行应用一个时间序列模型,以便从每个模型中获取系数。就我而言,我将使用forecast包中的auto.arima函数。我尝试了两种方法来解决我的问题,我将在下面介绍:

library(forecast)
set.seed(123)
Q <- as.data.frame(matrix(rnorm(250000*1000),nrow = 250000,ncol = 1000,byrow = T))
#Approach 1
models <- apply(Q, 1, auto.arima)
#Extract coeffs
coeffs <- lapply(models, function(x) x$coef)
#Approach 2
#Create a list and save coeff using a loop
tlist <- list(0)
for(i in 1:dim(Q)[1])
{
models <- apply(Q[i,], 1, auto.arima)
coeffs <- as.data.frame(lapply(models, function(x) as.data.frame(t(x$coef))))
tlist[[i]] <- coeffs
gc()
}

在方法 1 中,我使用apply()函数创建一个列表以保存模型,因此我使用lapply()来提取系数。这种方法的问题在于它花了 60 个小时,但它没有完成。

在方法 2 中,它是一个经典循环,以便为每一行应用函数,然后将结果保存在列表中。情况是一样的,30个小时,但没有结束。

在这两种情况下,任务都没有完成,最终我的电脑崩溃了。我不知道如何解决这个时间问题,因为看起来我的解决方案很慢。我的电脑有8GB内存和Windows 64位系统。我想使此操作按行更快。如果我可以将系数的结果直接添加到Q那就太好了,但如果不可能,包含结果的列表会很棒。Q是一个数据帧,但它也可以是一个数据表。

有什么方法可以提升我的代码以获得我的结果吗?非常感谢您的帮助。

正如@IanCampbell在评论中所说,auto.arima函数是大部分时间花费的地方。我在 Windows 上使用 2 核机器,我总是转向future.apply执行并行任务。

我只使用了 250 x 100 矩阵 - 我不需要测试:) 60 小时。使用 2 核,时间从 20 秒增加到 14 秒。

library(forecast)
library(future.apply)
set.seed(123)
nr = 250L
nc = 100L
mat <- matrix(rnorm(nr * nc), nrow = nr, ncol = nc, byrow = TRUE)
system.time(models1a <- apply(mat, 1L, auto.arima))
##   user  system elapsed 
##  19.84    0.02   20.04 
plan("multiprocess") ## needed for future_apply to make use of multiple cores
system.time(models1b <- future_apply(mat, 1L, auto.arima))
##   user  system elapsed 
##   0.48    0.02   14.22 
## future_lapply not needed - this is fast
identical(lapply(models1a, '[[', "coef"), lapply(models1b, '[[', "coef"))
## [1] TRUE

最新更新