我正在尝试使用R计算位于两点之间的栅格中所有像素的均值和标准差。我编写了一个函数,该函数执行的操作与此接近,因此我在起点和终点之间创建了一系列均匀间隔的点,从栅格中采样,然后计算均值和标准差。
不幸的是,由于与合作者之间复杂的数据共享协议,我无法在此处共享任何数据,但是可以共享我的脚本。
这是用于计算平均值和标准偏差的功能
meanstdv <- function(data,ras,x,y) {
require(raster)
test=SpatialPoints(approx(c(data$X[which((data$OBSERVED==1)&(data$REFID==x-1))],data$X[which((data$REFID==x)&(data$SAMPLEID==y))]),c(data$Y[which((data$OBSERVED==1)&(data$REFID==x-1))],data$Y[which((data$REFID==x)&(data$SAMPLEID==y))]),n=Mod(diff(c(data$Z[which((data$OBSERVED==1)&(data$REFID==x-1))],data$Z[which((data$REFID==x)&(data$SAMPLEID==y))])))))
averages=mean(extract(ras, test))
stdevs=sd(extract(ras, test))
dataindex=which((data$REFID==x)&(data$SAMPLEID==y))
layerval=cbind(dataindex,averages,stdevs)
return(layerval)
}
然后我尝试使用以下并行化的Apply函数将此函数应用于我的整个数据框
library(parallel)
cl <- makeCluster(32)
clusterEvalQ(cl, source("meanstdv.R"))
clusterExport(cl, "data")
clusterExport(cl, "raster")
inner_loop = function(i)
{
onestep = lapply(1:31, function(j) try(meanstdv(data=data,ras=raster,x=i,y=j)))
onestep2 = do.call(rbind, onestep)
}
outer_loop_parallel = parallel::parLapply(cl,2:length(levels(data$REFID)), function(i) try(inner_loop))
stopCluster(cl)
数据帧有17718843行,并且栅格尺寸为4533 X4991。这似乎可行,但是速度非常慢。一位同事为我做了一些分析,结果表明实际的计算几乎不需要时间,但是90%以上的时间都花在了垃圾收集上。这浪费了过多的时间。我认为这是由于我对栅格数据包的依赖。关于解决方案,我的第一个想法是将栅格加载为矩阵,并使用类似于matlab中的raycast()函数的函数
我在R中找不到与此类似的任何东西,并且不确定如何自己重新创建它。有没有办法在R中创建光线投射函数,或者有其他更有效的方法来实现我想做的事情?