0

我有两个数据框,“a”和“b”。它们都有 gps 数据,但“a”有 1000 行,“b”有 5 行。我正在将距离与半正弦公式进行比较,但我想应用该函数,以便将“a”的每一行与“b”的每一行进行比较。我应该得到 5000 个结果。

这是我到目前为止所拥有的,但它只给了我 1000 个结果:

library(geosphere)

for(i in 1:nrow(a)){
  distHaversine(a[,c(11,9)],b[,c(4,2)])
}

提前感谢您的任何帮助。

编辑

我找到了一个更好的解决方案来减少代码和计算时间:

library(geosphere)

result <- distm(a[ , c(11, 9)], b[ , c(4, 2)], fun = distHaversine)
4

2 回答 2

2

也许像下面这样。

result <- matrix(numeric(nrow(a)*nrow(b)), ncol = nrow(b))

for(i in seq_len(nrow(a))){
    for(j in seq_len(nrow(b))){
        result[i, j] <- distHaversine(a[i, c(11, 9)],b[j, c(4, 2)])
    }
}

result
于 2017-07-13T12:47:50.437 回答
0

这可能是您的解决方案:

indx <- expand.grid(a=1:1000,b=1:5)

res <- apply(indx,1,function(x) distHaversine(a[x[1],],b[x[2],]))

我结合expand.grid了两个 data.frames 的所有行索引,然后将它们用于apply函数内部的索引。

要追溯您计算的距离,您可以将结果作为列添加到索引中。

> head(cbind(indx,res))
  a b      res
1 1 1 12318145
2 2 1  5528108
3 3 1 11090739
4 4 1 14962267
5 5 1 19480911
6 6 1  8936878
于 2017-07-13T12:55:28.703 回答