我正在处理全部61,143行和9,864列的几个数据帧。这使得每个数据帧中的值超过6亿。这使得对数据帧的任何计算都极其缓慢-数小时。例如:
OBS 61143 obs. of 9864 variables
OBS.MAX <- apply(OBS, 1, max)
这些值最初是从netcdf文件派生的,然后我将其从光栅块转换为数据帧。有没有像上面这样更快的计算方法?是否在这种效率低下的数据框架内工作?
答案 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
基于此,我将使用RasterBrick
和max
(或更常见的是calc
,因为从文件中提取值也需要时间
system.time( values(bb))
# user system elapsed
# 21.91 5.28 27.18
但是,这很大程度上取决于您的工作流程-例如,每个数据集要进行多少次计算。 这些计算需要一段时间,但是您报告了“几个小时”的计算。这表明问题出在您正在应用的函数中。也许您需要重写这些。