r - 如何从距离矩阵中提取组内和组间距离?在 R

标签 r matrix distance

我有这个数据集:

values<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01)
codes<-c("A_1","A_2","A_3","B_1","B_2","B_3","B_4","C_1","C_2","C_3")
names(values)<-codes

在代码中,字母表示一个组,数字表示每个组中的一个案例。因此我分为三组,每组有 3 到 4 个案例(实际数据集要大得多,但这是一个子集)。

然后我计算距离矩阵:

dist(values)->dist.m

现在我想将 dist.m 转换为包含两列的数据集:一列包含所有组“内部”的距离(A_1 和 A_2 之间、B_2 和 B_4 之间的距离等),另一列包含“组之间”的距离(A_1 和 B_1 之间,C_1 和 B_4 之间,等等)

在 R 中有什么简单的方法可以做到这一点吗?

如有任何帮助,我们将不胜感激。

非常感谢您。

蒂娜。

最佳答案

他们可能称它们为矩阵,但实际上不是。但是,有一个 as.matrix 函数可以让您获得矩阵索引:

> as.matrix(dist.m)[grep("A", codes), grep("A", codes) ]
      A_1   A_2   A_3
A_1 0.000 0.298 0.398
A_2 0.298 0.000 0.100
A_3 0.398 0.100 0.000

因此您可以使用非常紧凑的代码获得第一部分:

> sapply(LETTERS[1:3], function(let) as.matrix(dist.m)[grep(let, codes), grep(let, codes) ]
+ )
$A
      A_1   A_2   A_3
A_1 0.000 0.298 0.398
A_2 0.298 0.000 0.100
A_3 0.398 0.100 0.000

$B
      B_1   B_2   B_3   B_4
B_1 0.000 0.595 0.195 0.004
B_2 0.595 0.000 0.400 0.599
B_3 0.195 0.400 0.000 0.199
B_4 0.004 0.599 0.199 0.000

$C
      C_1   C_2   C_3
C_1 0.000 0.298 0.008
C_2 0.298 0.000 0.290
C_3 0.008 0.290 0.000

然后使用负逻辑寻址得到剩下的:

> sapply(LETTERS[1:3], function(let) as.matrix(dist.m)[grepl(let, codes), !grepl(let, codes) ]
+ )
$A
      B_1   B_2   B_3   B_4   C_1   C_2   C_3
A_1 0.003 0.598 0.198 0.001 0.000 0.298 0.008
A_2 0.295 0.300 0.100 0.299 0.298 0.000 0.290
A_3 0.395 0.200 0.200 0.399 0.398 0.100 0.390

$B
      A_1   A_2   A_3   C_1   C_2   C_3
B_1 0.003 0.295 0.395 0.003 0.295 0.005
B_2 0.598 0.300 0.200 0.598 0.300 0.590
B_3 0.198 0.100 0.200 0.198 0.100 0.190
B_4 0.001 0.299 0.399 0.001 0.299 0.009

$C
      A_1   A_2   A_3   B_1   B_2   B_3   B_4
C_1 0.000 0.298 0.398 0.003 0.598 0.198 0.001
C_2 0.298 0.000 0.100 0.295 0.300 0.100 0.299
C_3 0.008 0.290 0.390 0.005 0.590 0.190 0.009

我看不到将其表示为两列数据结构的方法,但您可以在 pkg::reshape2 中使用 melt 来获得三列结构:

> melt( as.matrix(dist.m)[grep("A", codes), grep("A", codes) ] )
  Var1 Var2 value
1  A_1  A_1 0.000
2  A_2  A_1 0.298
3  A_3  A_1 0.398
4  A_1  A_2 0.298
5  A_2  A_2 0.000
6  A_3  A_2 0.100
7  A_1  A_3 0.398
8  A_2  A_3 0.100
9  A_3  A_3 0.000

这会给你一个相当长的数据框来显示,但将 melt 放在函数调用中就足够容易了。

关于r - 如何从距离矩阵中提取组内和组间距离?在 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367277/

相关文章:

r - 在输出到 Shiny 应用程序之前更改 DT 包中的列名

javascript - 将线性阵列转换为矩阵的有效方法

matlab - 将空矩阵分配给Matlab中的空子矩阵

c# - 如何测量对角线距离点?

r - 估计威 bool 密度参数(错误 : "...initial value in ' vmmin' is not finite")

r - 跟踪顺序 plotly R

mysql - 两点之间的距离。东西+南北

machine-learning - 我们可以使用多少种距离函数?

r - 如何计算生成相关二元变量的边际概率

r - 为什么 model.matrix 这么慢?