【问题标题】:Convert combn output to matrix of type 'dist'将组合输出转换为“dist”类型的矩阵
【发布时间】:2018-04-16 09:11:11
【问题描述】:

我有一个如下形式的数据框:

   dim1  dim2
1 Loc.1 0.325
2 Loc.2 0.325
3 Loc.3 0.321
4 Loc.4 0.256
5 Loc.5 0.255

我想计算“dim2”中两 (2) 个元素的每个组合的平均值;并将输出转换为矩阵;同时保留 'dim1' 提供的信息。

现在,我可以使用 combn 函数获得成对均值:

combn(tab[,2],2, mean)
[1] 0.3250 0.3230 0.2905 0.2900 0.3230 0.2905 0.2900 0.2885 0.2880 0.2555

但我希望它以类似矩阵的形式显示(这实际上与“dist”类的对象非常相似,因为我希望它可以用于进一步分析),如下所示:

        Loc.1   Loc.2   Loc.3   Loc.4
Loc.2   0.325           
Loc.3   0.323   0.323       
Loc.4   0.290   0.291   0.289   
Loc.5   0.290   0.290   0.288   0.256

(如您所见,我还需要信息“Loc.x”)

我找不到可以直接在我的数据框“选项卡”上计算成对计算的简单函数。我可以使用 for 循环,但我觉得应该有更直接的方式。

有什么建议吗?非常感谢!

【问题讨论】:

    标签: r combn pairwise


    【解决方案1】:

    这是一个使用expand.grid 而不是combn 的单行代码。

    as.dist(matrix(apply(expand.grid(tab[, 2], tab[, 2]), 1, mean), 5, 5))
    #       1      2      3      4
    #2 0.3250
    #3 0.3230 0.3230
    #4 0.2905 0.2905 0.2885
    #5 0.2900 0.2900 0.2880 0.2555
    

    之所以可行,是因为expand.grid 考虑了tab[, 2] 两个列向量的所有可能组合,而combn 忽略了对角线元素;然后我们对组合矩阵进行逐行操作,计算均值,并将vector 首先转换为matrix,然后转换为dist 对象。

    【讨论】:

      【解决方案2】:

      这里有一个比较简单的方法将向量转换为距离矩阵:

      vec <- c(0.3250, 0.3230, 0.2905, 0.2900, 0.3230, 0.2905, 0.2900, 0.2885, 0.2880, 0.2555)
      
      mat <- matrix(nrow = 5, ncol = 5)
      mat[lower.tri(mat)] <- vec
      mat <- as.dist(mat)
      
      #output
      > mat
             1      2      3      4
      2 0.3250                     
      3 0.3230 0.3230              
      4 0.2905 0.2905 0.2885       
      5 0.2900 0.2900 0.2880 0.2555
      

      【讨论】:

        【解决方案3】:

        您也可以使用outer 函数。

        dim2 <- as.numeric(tab$dim2)
        names(dim2) <- tab$dim1
        x <- outer(dim2, dim2, function(x,y) (x + y) / 2)
        as.dist(x)
        #        Loc.1  Loc.2  Loc.3  Loc.4
        # Loc.2 0.3250                     
        # Loc.3 0.3230 0.3230              
        # Loc.4 0.2905 0.2905 0.2885       
        # Loc.5 0.2900 0.2900 0.2880 0.2555
        

        【讨论】:

        • 非常感谢大家!所有这些答案都非常有用。万事如意!
        猜你喜欢
        • 2021-05-17
        • 2011-10-18
        • 1970-01-01
        • 2013-07-26
        • 2017-08-30
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多