首页 > 解决方案 > 在非常大的数据帧上处理计算的更快方法

问题描述

我正在处理几个数据框,它们都是 61,143 行和 9,864 列。这使得每个数据帧中的值刚刚超过 6 亿。这使得对数据帧的任何计算都非常慢 - 几个小时。例如:

OBS    61143 obs. of 9864 variables

OBS.MAX <- apply(OBS, 1, max)

这些值最初来自 netcdf 文件,然后我将其从栅格砖转换为数据框。有没有更快的方法可以完成上述计算?在这样的数据框架内工作效率低下吗?

标签: r

解决方案


与一些示例数据交谈总是更容易

library(raster)
b <- brick(ncol=245, nrow=250, nl=9864)
v <- matrix(rep(1:ncell(b), nlayers(b)), ncol=nlayers(b))
values(b) <- v
bb <- writeRaster(b, "test.nc", overwrite=TRUE)
d <- data.frame(v)

现在我得到以下

# matrix 
system.time(apply(v, 1, max))
#   user  system elapsed 
#  10.68    0.79   11.46 

# data.frame
system.time(apply(d, 1, max))
#   user  system elapsed 
#  20.48    0.61   21.11 

# RasterBrick (values in memory)
system.time(max(b))
#   user  system elapsed 
#   6.72    0.29    7.00 

system.time(calc(b, max))
#   user  system elapsed 
#  16.76    0.33   17.11 

# RasterBrick (values on disk)
system.time(max(bb))
#   user  system elapsed 
#  19.25    8.43   27.70 

system.time(calc(bb, max))
#   user  system elapsed 
#  22.69    5.92   28.62 

基于此,我将使用RasterBrickand max(或calc更一般地),因为从文件中提取值也需要时间

system.time( values(bb))
#   user  system elapsed 
#  21.91    5.28   27.18 

但是很大程度上取决于您的工作流程——例如,每个数据集有多少计算。这些计算需要一段时间,但您报告“几个小时”的计算。这表明问题出在您正在应用的功能中。也许你需要重写这些。


推荐阅读