R语言之将对称矩阵转为列表


1. 数据准备

library('dplyr')
# 构建数据集
df1 = sample(100,1000,replace = T) %>% matrix(100,10,byrow = F) %>% data.frame()
df2 = sample(100,1000,replace = T) %>% matrix(100,10,byrow = F) %>% data.frame()

#定义列名
names(df1) = paste('Smp', seq(10), sep = '')
names(df2) = paste('Smp', sample(10,10), sep = '')

#简单可视化
par(mfrow = c(1,2))
boxplot(df1,main = 'df1');boxplot(df2,main = 'df2')
par(mfrow = c(1,1))

2. 生成距离矩阵,

多个矩阵的列名及顺序必须一致

##调整样品顺序使一致
df2 = df2[,names(df1)]

dst1 = df1 %>% t() %>% dist(method = 'euclidean',upper = T,diag = 0) %>% as.matrix()
dst2 = df2 %>% t() %>% dist(method = 'euclidean',upper = T,diag = 0) %>% as.matrix()

3. 定义简单函数

mtrx2cols = function(m1,m2,val1,val2){
  lt = lower.tri(m1)  #获取下半角为TRUE,上半角为FALSE的同维度矩阵;
  res = data.frame(row = row(m1,as.factor = T)[lt],  #返回矩阵m1的下半角元素对应的行名
                   col = col(m1,as.factor = T)[lt],  #返回矩阵m1的下半角对应的列名
                   val1 = m1[lt], val2= m2[lt]) #按列依次获取矩阵下半角的元素
  names(res)[3:4] = c(val1,val2) #对后两列重命名,支持多个矩阵合并
  return(res)
}
    1. row()col()函数用于取矩阵元素的行或列下标矩阵。
      row(as.factor = T)可以理解为将行名向右平移填充整个矩阵
      col(as.factor = T)可以理解为将列名向下平移填充整个矩阵
    1. 该函数支持多个矩阵的转换

执行转换

res = mtrx2cols(dst1,dst2,'Eco','logy')

你可能感兴趣的:(R语言之将对称矩阵转为列表)