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)
}
-
row()
和col()
函数用于取矩阵元素的行或列下标矩阵。
row(as.factor = T)
可以理解为将行名向右平移填充整个矩阵
col(as.factor = T)
可以理解为将列名向下平移填充整个矩阵
-
- 该函数支持多个矩阵的转换
执行转换
res = mtrx2cols(dst1,dst2,'Eco','logy')