美文网首页
距离矩阵、上下三角和三元组间的变换

距离矩阵、上下三角和三元组间的变换

作者: 吴十三和小可爱的札记 | 来源:发表于2020-04-09 18:44 被阅读0次

    距离矩阵输出

    利用vegan包中的varespec 数据构建示例数据,生成下三角的距离矩阵。

    library(vegan)
    data(varespec)
    # 求spec 间的距离需要对数据进行转制 — t()
    var_dis <- vegdist(t(varespec), method = 'bray')
    
    # dis类型的数据一般是下三角距离矩阵
    
    # 若要输出在本地,需要首先转化为 matrix 类型
    var_matrix <- as.matrix(var_dis)
    

    上下三角提取

    利用函数tril(){Matrix}; triu(){Matrix}; lower.tri(){base}; upper.tri(){base}进行上下三角提取。

    # 提取矩阵对角线值
    diag(var_matrix)
    
    # 提取下三角,上三角将全用点(.)代替
    tril(var_matrix)
    
    # 提取上三角,下三角将全用点(.)代替;
    triu(var_matrix)
    
    # 上三角用指定值代替
    var_matrix[upper.tri(var_matrix)] <-  0
    
    # 下三角用指定值代替
    var_matrix[lower.tri(var_matrix)] <-  NA
    

    距离矩阵—三元组

    Matrix包内置了很多矩阵class,例如dgCMatrix,可以通过??dgCMatrix查看具体信息,同时R会列举所有class. matrix_class.png
    # 将上三角所有数据用0代替
    var_matrix[upper.tri(var_matrix)] <-  0
    
    
    dtC_mat = Matrix(var_matrix)
    mat = summary(dgC_mat)
    triplet_mat = as.data.frame(mat)
    triplet_mat
    

    三元组—矩阵

    triplet_mat
    # 根据三列数据的前两列可以确定原矩阵的维度
    # 一般是前两列数据中的最大值
    # 但有的矩阵输出时去掉对角0值,往往同时缺失了第一行和最后一行的坐标,所以实际情况需要进行适当判断
    zero_mat = matrix(0, nrow = max(triplet_mat$i), 
                 ncol =  max(triplet_mat$j))
    # mat[cbind(frame[,1], frame[,2])] <- frame$...2
    
    str(triplet_mat)
    
    # 利用三元组数据填充0矩阵
    zero_mat[as.matrix(triplet_mat[1:2])] <- triplet_mat$x
    
    # 利用下三角数据填充上三角,具有上三角函数亦同
    zero_mat[upper.tri(zero_mat, diag = F)] = 
      t(zero_mat)[upper.tri(zero_mat, diag = F)]
    
    zero_mat
    

    相关文章

      网友评论

          本文标题:距离矩阵、上下三角和三元组间的变换

          本文链接:https://www.haomeiwen.com/subject/olchmhtx.html