根据 R 中匹配的前缀列和行名称创建平均距离矩阵

问题描述 投票:0回答:1

我想从数百个距离矩阵的数组中创建一个新的距离矩阵。这个新矩阵将是给定一组成对距离的平均距离。要平均的值基于匹配的名称前缀。更容易说明,因为我的语言可能不正确:这是一个示例距离矩阵:

                    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
r arrays matrix match average
1个回答
0
投票
(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
© www.soinside.com 2019 - 2024. All rights reserved.