相关疑难解决方法(0)

在R中有效地从网格中插值

我有一个按位置划分的海洋深度数据网格,我正在尝试为选定的GPS点插入深度值.

我们一直在使用RSAGA :: pick.from.points,它适用于小型数据集.

require(RSAGA)

depthdata <- cbind.data.frame(x=c(74.136, 74.135, 74.134, 74.133, 74.132, 74.131, 74.130, 74.129, 74.128, 74.127), 
y=rep(40, times=10), 
depth=c(-0.6, -0.6, -0.9, -0.9, -0.9, -0.9, -0.9, -0.9, -0.6, -0.6))

mylocs <- rbind(c(-74.1325, 40), c(-74.1305, 40))
colnames(mylocs) <- c("x", "y")

results <- pick.from.points(data=mylocs, src=depthdata, pick=c("depth"), method="nearest.neighbour")
mydepths <- results$depth
Run Code Online (Sandbox Code Playgroud)

但是我们的深度数据集包含6900万个数据点,我们有500万个GPS点,我们想要深度估计,而pick.from.points对于这个数据集来说只需要太长时间(> 2周).我们认为我们可以在MATLAB或ArcMap中更快地完成这项任务,但我们正试图将这项任务纳入R中更长的工作流程中,我们正在为其他人编写反复运行的工作流程,因此切换到专有软件的部分工作流程不太理想.

我们愿意为速度牺牲一定程度的准确性.

我尽可能地寻找解决方案,但我对网格数据和插值相当新,因此可能使用了不恰当的语言,因此缺少一个简单的解决方案.


interpolation r

5
推荐指数
1
解决办法
1161
查看次数

最近点的路径

我有两组积分,叫做pathcenters.对于每个点path,我想要一种有效的方法来找到最近点的ID centers.我想在R中这样做.下面是一个简单的可重复的例子.

set.seed(1)
n <- 10000
x <- 100*cumprod(1 + rnorm(n, 0.0001, 0.002))
y <- 50*cumprod(1 + rnorm(n, 0.0001, 0.002))

path <- data.frame(cbind(x=x, y=y))

centers <- expand.grid(x=seq(0, 500,by=0.5) + rnorm(1001), 
                       y=seq(0, 500, by=0.2) + rnorm(2501))

centers$id <- seq(nrow(centers))
Run Code Online (Sandbox Code Playgroud)

x并且y是坐标.我想在pathdata.frame中添加一列,它具有给定x和y坐标的最近中心的id.然后我想获得所有独特的ID.

我的解决方案目前确实有效,但当问题的规模增加时,它的速度非常慢.我想要更高效的东西.

path$closest.id <- sapply(seq(nrow(path)), function(z){
   tmp <- ((centers$x - path[z, 'x'])^2) + ((centers$y - path[z, 'y'])^2)
   as.numeric(centers[tmp == min(tmp), 'id'])
})

output <- unique(path$closest.id)
Run Code Online (Sandbox Code Playgroud)

任何有关加快这一点的帮助将不胜感激.

我认为data.table可能有所帮助,但理想情况下我所寻找的是一种算法,在搜索方面可能更聪明,即不是计算到每个中心的距离,而是只选择最小的...获取id ... …

performance r spatial rcpp rcpp11

4
推荐指数
2
解决办法
1367
查看次数

标签 统计

r ×2

interpolation ×1

performance ×1

rcpp ×1

rcpp11 ×1

spatial ×1