[英]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.