处理非常大的数据帧的更快的方法

时间:2019-07-15 08:47:50

标签: r

我正在处理全部61,143行和9,864列的几个数据帧。这使得每个数据帧中的值超过6亿。这使得对数据帧的任何计算都极其缓慢-数小时。例如:

OBS    61143 obs. of 9864 variables

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

这些值最初是从netcdf文件派生的,然后我将其从光栅块转换为数据帧。有没有像上面这样更快的计算方法?是否在这种效率低下的数据框架内工作?

1 个答案:

答案 0 :(得分:1)

总是比较容易处理一些示例数据

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 

基于此,我将使用RasterBrickmax(或更常见的是calc,因为从文件中提取值也需要时间

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

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