我想从数百个距离矩阵的数组中创建一个新的距离矩阵。这个新矩阵将是给定一组成对距离的平均距离。要平均的值基于匹配的名称前缀。更容易说明,因为我的语言可能不正确:这是一个示例距离矩阵:
SpeciesA_1 SpeciesA_2 SpeciesC_1. SpeciesC_2
SpeciesA_1 0 0.2 0.3 0.4
SpeciesA_2 0.2 0 0.4 0.5
SpeciesC_1 0.3 0.4 0 0.1
SpeciesC_2 0.4 0.5 0.1 0
我想要给定两个前缀的所有可能的成对组合的平均值。例如:
SpeciesA_1 & SpeciesC_1 (0.3)
SpeciesA_1 & SpeciesC_2 (0.4)
SpeciesA_2 & SpeciesC_1 (0.4)
SpeciesA_2 & SpeciesC_2 (0.5)
因此,本例中我得到的新距离矩阵应该是:
SpeciesA SpeciesC
SpeciesA 0 0.4
SpeciesC 0.4 0
我的实际矩阵大约有 140 列和行。我不知道从哪里开始。这些 dist 是一个数组:
dists[,,i]
我无法使用循环(我通常会通过选择名字开始),因为它是一个我从未使用过的数组。
dim(dists)
[1] 135 135 138
(seed <- sample(.Machine$integer.max, 1))
#> [1] 557411388
set.seed(seed)
x <- as.matrix(dist(setNames(runif(7*5), t(outer(LETTERS[1:7], 1:5, paste, sep = "_")))))
idx <- split(1:nrow(x), sapply(strsplit(rownames(x), "_"), "[[", 1))
m <- matrix(0, length(idx), length(idx), 0, rep(list(names(idx)), 2))
m[lower.tri(m)] <- combn(idx, 2, \(i) mean(x[i[[1]], i[[2]]]))
m[upper.tri(m)] <- t(m)[upper.tri(m)]
m
#> A B C D E F G
#> A 0.0000000 0.3722705 0.3180695 0.2723116 0.2775542 0.3968128 0.2932886
#> B 0.3722705 0.0000000 0.2961510 0.2754567 0.3273329 0.4300852 0.3064792
#> C 0.3180695 0.2961510 0.0000000 0.2080327 0.2563066 0.4066203 0.2503920
#> D 0.2723116 0.2754567 0.2080327 0.0000000 0.2058539 0.3802285 0.1925332
#> E 0.2775542 0.3273329 0.2563066 0.2058539 0.0000000 0.3840585 0.2328239
#> F 0.3968128 0.4300852 0.4066203 0.3802285 0.3840585 0.0000000 0.3927039
#> G 0.2932886 0.3064792 0.2503920 0.1925332 0.2328239 0.3927039 0.0000000