【问题标题】:how to extract intragroup and intergroup distances from a distance matrix? in R如何从距离矩阵中提取组内和组间距离?在 R 中
【发布时间】:2013-06-28 14:37:18
【问题描述】:

我有这个数据集:

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 中有没有简单的方法来做到这一点?

任何帮助将不胜感激。

非常感谢您。

蒂娜。

【问题讨论】:

    标签: r matrix distance


    【解决方案1】:

    他们可能称它们为矩阵,但实际上并非如此。然而,有一个 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 放在函数调用中会很容易。

    【讨论】:

    • 哦,很好。我担心你会要求我去掉传递的重复和零。
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2016-12-29
    • 2022-01-12
    • 2017-01-07
    • 2011-08-08
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多