用于两个不同向量之间成对比较的距离矩阵

Distance matrix for pairwise comparisons between two different vectors

我正在尝试计算向量 j 和向量 k 的每个成对比较之间的距离矩阵。我遇到了一个 stack overflow post related to this 但它会将 j 的每一行与 k 的相应行进行比较。但是,我想将 j 的每一行与 k 的每一行进行比较,依此类推...就像 R 中的 dist() 函数将用一个向量完成,但是用两个向量完成。

例如,dist() 将采用 100 个单位的矢量和 return 4950 comparisons/distances 的下三角。除了使用 100 个单位的向量 j 和 100 个单位的向量 k 并将每个 j 与每个 k 进行比较之外,我想实现这一点。

一个更小的例子:

set.seed(5)
a<-rnorm(5)
b<-rnorm(5)
cbind(a,b)
               a          b
[1,] -0.84085548 -0.6029080
[2,]  1.38435934 -0.4721664
[3,] -1.25549186 -0.6353713
[4,]  0.07014277 -0.2857736
[5,]  1.71144087  0.1381082

我想将 1a 与 1b、2b、3b、4b 和 5b 进行比较。然后,2a 到 1b、2b、3b、4b、5b。等等。就像 dist() 一样,除了它本身不是一个距离矩阵,而是一个具有不同向量的距离矩阵。

有谁知道完成此任务的最佳方法是什么?

编辑:除了 Joel 的出色 tidyverse 回答之外,我还想出了一种基本的 R 解决方法来执行此操作...

如果您有一个包含 100 个项目的向量 A 和一个包含 100 个项目的向量 B,您可以连接一个 A 后跟 B 的向量,使用 dist 然后仅索引两个连接向量之间比较的列和行:

distM<-as.matrix(dist(c(A, B)))
distM<-as.matrix(distM[-(1:100),-(101:200)])

如果我要解决这个问题,我会使用 crossing() 函数创建所有比较的列表,然后使用 mutate() 函数计算所有距离。

这将使用基于 r 的 tidyverse 库中的函数。如果您需要基本的 r 解决方案,请告诉我,我会重新考虑。

# Imports
library(tidyverse)

# Data construction
set.seed(5)
a<-rnorm(5)
b<-rnorm(5)

# Create all pairwise comparisons
pairs <- crossing(a, b)

# Calculate the distances
pairs %>% 
  mutate(dist = abs(a - b))
#> # A tibble: 25 x 3
#>         a      b  dist
#>     <dbl>  <dbl> <dbl>
#>  1 -1.26  -0.635 0.620
#>  2 -1.26  -0.603 0.653
#>  3 -1.26  -0.472 0.783
#>  4 -1.26  -0.286 0.970
#>  5 -1.26   0.138 1.39 
#>  6 -0.841 -0.635 0.205
#>  7 -0.841 -0.603 0.238
#>  8 -0.841 -0.472 0.369
#>  9 -0.841 -0.286 0.555
#> 10 -0.841  0.138 0.979
#> # ... with 15 more rows

reprex package (v2.0.0)

于 2021-04-06 创建