用于两个不同向量之间成对比较的距离矩阵
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 创建
我正在尝试计算向量 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 创建