Я пытаюсь использовать 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)
}
Затем я пытаюсь применить эту функцию ко всему моему фрейму данных с помощью следующей параллельной функции применения
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 X 4991. Кажется, что это работает, но очень медленно.Коллега выполнил некоторые профилирования для меня, и оказалось, что реальные расчеты занимают почти нет времени, но более 90% времени уходит на сборку мусора.Это напрасная трата времени.Я думаю, что это связано с моей зависимостью от растрового пакета.Моей первой мыслью относительно решения было загрузить мой растр в виде матрицы и использовать функцию, аналогичную функции raycast () в matlab
Документация Raycast
Я могне могу найти ничего похожего на это в R, и я не уверен, как воссоздать это сам.Есть ли способ создать функцию raycast в R, или есть какой-то другой, более эффективный способ достичь того, что я пытаюсь сделать?