我正在处理几个全部为61,143行和9,864列的数据帧。这使得每个数据帧中的值略高于6亿。这使得数据帧上的任何计算都非常慢-几个小时。例如:
OBS 61143 obs. of 9864 variables
OBS.MAX <- apply(OBS, 1, max)这些值最初是从netcdf文件派生出来的,然后我将该文件从光栅砖块转换为数据帧。有没有更快的方法可以完成像上面这样的计算?在这样的数据帧中工作效率低吗?
发布于 2019-07-15 22:12:11
与一些示例数据交谈总是更容易一些
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 但这在很大程度上取决于你的工作流程-例如,每个数据集有多少计算。这些计算需要一段时间,但您会报告“几个小时”的计算。这表明问题出在您正在应用的函数中。也许你需要重写这些。
https://stackoverflow.com/questions/57036203
复制相似问题