【发布时间】:2018-09-25 17:46:37
【问题描述】:
我有两组点(带有 x、y、z 坐标)数据 dtmT(113k 观测值)和 ptmT(200k 观测值)。对于 dtmT 中的每个点,我都希望计算到 ptmT 中某个点的最短距离。我对 R 非常陌生,没有其他编程背景,所以我嵌套了 for 循环,因此对于 dtmT 的每个点,它计算该点与 ptmT 中每个点之间的距离并将其存储在矩阵中(ptmTDistM) .我使用后循环将矩阵中每一列的最小值作为向量获取,然后使用 cbind 将其附加回 dtmT,以便最终产品是 dtmT,其中 x,y,z,Dist 表示可能的最短距离dtmT 指向 ptmT 内的任何点。这对于 5 次观察和最多 500 次非常有效,但是当我尝试使用 5,000 次并且完整的数据集是 dtmT 中的 113K 观察和 ptmT 中的 200k 时,它会挂起。我最初使用数据框对此进行了编程,但已经阅读了一些让我尝试使用矩阵的问题和答案。我也明白使用向量和 lapply 组是最好的,我不确定如何将嵌套的 for 循环转换到 lapply 组,特别是因为索引对于我现在如何获得它非常重要。我也看过 Dist() 但不确定如何应用它来获得我需要的东西。
提供了每个数据集的前 5 个观察结果以及我到目前为止所做的工作。
非常感谢您的帮助!
#first 5 observations of ptmT dataset
ptmT <- c(621019.2, 621024.2, 621023.7, 621018.3, 621019.2, 2701229.1,
2701231.2, 2701231.9, 2701230.2, 2701229.1, 2071.5, 2080.0, 2080.0, 2071.5,
2071.5)
dim(ptmT) <- c(5,3)
colnames(ptmT) <- c("XP", "YP", "ZP")
#first 5 observations of dtmT dataset
dtmT <- c( 621757.360, 621757.360, 621757.419, 621757.536,
621757.540,2701071.810, 2701071.810, 2701071.814, 2701071.843, 2701071.844,
2089.210, 2088.110, 2070.435, 2053.536, 2052.951)
dim(dtmT) <- c(5,3)
colnames(dtmT) <- c("X", "Y", "Z")
dtmTDist <- 0
ptmTDist <- 0
ptmTDistM <- matrix(data = NA, nrow = length(ptmT[,1]), ncol =
length(dtmT[,1]))
require (svMisc)
for (row in 1:nrow(dtmT)) {
progress(row)
X <- dtmT[row, "X"]
Y <- dtmT[row, "Y"]
Z <- dtmT[row, "Z"]
for (i in 1:nrow(ptmT)) {
X2 <- ptmT[i, "XP"]
Y2 <- ptmT[i, "YP"]
Z2 <- ptmT[i, "ZP"]
D <- sqrt((X - X2)^2 + (Y - Y2)^2 + (Z - Z2)^2)
ptmTDistM[i,row] <- D
}
}
Dist <- apply(ptmTDistM, 2, min)
dtmT2 <- cbind(dtmT,Dist)
【问题讨论】:
-
您希望查看 purrr 包,或者,如果您需要并行处理,请查看新包 furrr。性能统计:r-bloggers.com/imputing-missing-values-in-parallel-using-furrr
-
对此进行快速测试。不确定效率,但没有循环! stat.ethz.ch/pipermail/r-help/2014-August/421040.html