我正在尝试获取一个矩阵,其中包含两个列表中各点之间的距离。
点矢量包含纬度和经度,可以使用 geosphere 包中的distCosine函数计算任意两点之间的距离。
> Points_a
lon lat
1 -77.69271 45.52428
2 -79.60968 43.82496
3 -79.30113 43.72304
> Points_b
lon lat
1 -77.67886 45.48214
2 -77.67886 45.48214
3 -77.67886 45.48214
4 -79.60874 43.82486
我想得到一个看起来像的矩阵:
d_11 d_12 d_13
d_21 d_22 d_23
d_31 d_32 d_33
d_41 d_42 d_43
我正在努力想出一种生成矩阵的方法,而不仅仅是循环使用Points_a和Points_b并计算每个组合,有人能提出更优雅的解决方案吗?
答案 0 :(得分:4)
您可以使用:
outer(seq(nrow(Points_a)),
seq(nrow(Points_b)),
Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
)
(根据@CarlWitthoft提示)
根据您发布的所需输出,您可能需要转置t()
,或者只需将_a
替换为_b
以上。
编辑:一些解释:
seq(nrow(Points_x))
:创建一个从1到Points_x
行数的序列; distCosine(Points_a[i,], Points_b[j,])
:用于计算i
行Points_a
和j
行Points_b
给出的点之间距离的表达式; function(i, j)
:在上面的两个参数中使用了一个未命名的函数; Vectorize(...)
:确保在长度大于1的输入i
和j
的情况下,上面的未命名函数仅对向量(see this for more info)的每个元素调用一次; outer(x, y, f)
:创建“展开的”向量x
和y
,以便显示其元素的所有组合,并使用此输入调用f
(请参阅上面的链接) 。然后将结果重新组合成一个漂亮的矩阵。