簡體   English   中英

兩個不同向量之間成對比較的距離矩陣

[英]Distance matrix for pairwise comparisons between two different vectors

我正在嘗試計算向量 j 和向量 k 的每個成對比較之間的距離矩陣。 我遇到了一個與此相關的堆棧溢出帖子,但它將 j 的每一行與 k 的相應行進行比較。 但是,我想將 j 的每一行與 k 的每一行進行比較......就像 R 中的 dist() function 將使用一個向量完成,但是使用兩個向量。

例如, dist() 將采用 100 個單位的向量並返回一個具有 4950 個比較/距離的下三角形。 我想實現這一點,除非向量 j 為 100 個單位,向量 k 為 100 個單位,並將 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() 一樣,除了它本身不是一個距離矩陣,而是一個具有不同向量的距離矩陣。

有誰知道實現這一目標的最佳方法是什么?

編輯:除了喬爾很棒的 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() function 計算所有距離。

這將使用基礎 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

代表 package (v2.0.0) 於 2021 年 4 月 6 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM