R 在非常大的数据帧上处理计算的更快方法

R 在非常大的数据帧上处理计算的更快方法,r,R,我正在处理几个数据帧,它们都是61143行和9864列。这使得每个数据帧中的值超过6亿。这使得数据帧上的任何计算都极其缓慢——几个小时。例如: OBS 61143 obs. of 9864 variables OBS.MAX <- apply(OBS, 1, max) OBS 61143 OBS。共9864个变量 OBS.MAX用一些示例数据说话总是比较容易的 library(raster) b <- brick(ncol=245, nrow=250, nl=9864) v

我正在处理几个数据帧,它们都是61143行和9864列。这使得每个数据帧中的值超过6亿。这使得数据帧上的任何计算都极其缓慢——几个小时。例如:

OBS    61143 obs. of 9864 variables

OBS.MAX <- apply(OBS, 1, max)
OBS 61143 OBS。共9864个变量

OBS.MAX用一些示例数据说话总是比较容易的

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)
基于此,我将使用
RasterBrick
max
(或者更一般地说是
calc
),因为从文件中提取值也需要时间

system.time( values(bb))
#   user  system elapsed 
#  21.91    5.28   27.18 
但这在很大程度上取决于您的工作流程——例如,每个数据集有多少计算。
这些计算需要一段时间,但您报告了“几个小时”的计算。这表明问题出在您正在应用的函数中。也许您需要重写这些值。

6亿个值并没有那么大。R可以在几秒钟内对包含6000万行和10列的数据集运行操作。问题在于data.frames是面向列的。处理一个大的列比处理许多小的列要快。是否有一种自然的方法来重塑数据?使用矢量化操作的函数,例如
do.call(pmax,OBS)
。感谢您的评论。我可以重塑数据,但不确定有哪些选项可以让处理速度更快。向量化操作的具体作用是什么?它避免了许多函数调用的循环,这在R中很慢。此外,作为第一步,
apply
调用
as.matrix
。您不希望对较大的数据执行此操作,因为这是一项成本相当高的操作。1。使用矩阵。数据帧上的行操作速度很慢(这就是为什么apply每次运行时都会将其转换为矩阵)。2.使用快速商品功能,如
rowMax(OBS)
system.time( values(bb))
#   user  system elapsed 
#  21.91    5.28   27.18