如何获取相关矩阵lower.tri元素并保留对应行列名?
提取相关矩阵下三角元素并保留对应行列名
问题背景
基于mtcars数据集生成相关矩阵:
cor.Mat = round(cor(mtcars), 2) cor.Mat
输出:
mpg cyl disp hp drat wt qsec vs am gear carb mpg 1.00 -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66 0.60 0.48 -0.55 cyl -0.85 1.00 0.90 0.83 -0.70 0.78 -0.59 -0.81 -0.52 -0.49 0.53 disp -0.85 0.90 1.00 0.79 -0.71 0.89 -0.43 -0.71 -0.59 -0.56 0.39 hp -0.78 0.83 0.79 1.00 -0.45 0.66 -0.71 -0.72 -0.24 -0.13 0.75 drat 0.68 -0.70 -0.71 -0.45 1.00 -0.71 0.09 0.44 0.71 0.70 -0.09 wt -0.87 0.78 0.89 0.66 -0.71 1.00 -0.17 -0.55 -0.69 -0.58 0.43 qsec 0.42 -0.59 -0.43 -0.71 0.09 -0.17 1.00 0.74 -0.23 -0.21 -0.66 vs 0.66 -0.81 -0.71 -0.72 0.44 -0.55 0.74 1.00 0.17 0.21 -0.57 am 0.60 -0.52 -0.59 -0.24 0.71 -0.69 -0.23 0.17 1.00 0.79 0.06 gear 0.48 -0.49 -0.56 -0.13 0.70 -0.58 -0.21 0.21 0.79 1.00 0.27 carb -0.55 0.53 0.39 0.75 -0.09 0.43 -0.66 -0.57 0.06 0.27 1.00
使用cor.Mat[lower.tri(cor.Mat)]可提取下三角元素,但需要保留元素对应的行名和列名,得到类似如下格式的命名向量:
mpg--cyl mpg--disp mpg--hp mpg--drat mpg--wt mpg--qsec mpg--vs mpg--am ... -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66 0.60 ...
解决方案
方法1:基础R实现
通过索引获取下三角位置,拼接行列名作为向量名称:
# 获取下三角元素的位置索引 tri_indices <- which(lower.tri(cor.Mat), arr.ind = TRUE) # 拼接行名列名为元素名称 names_vec <- paste(rownames(cor.Mat)[tri_indices[,1]], colnames(cor.Mat)[tri_indices[,2]], sep = "--") # 提取元素并设置名称 result_vec <- cor.Mat[tri_indices] names(result_vec) <- names_vec # 查看结果 result_vec
输出示例:
mpg--cyl mpg--disp mpg--hp mpg--drat mpg--wt mpg--qsec mpg--vs mpg--am mpg--gear -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66 0.60 0.48 mpg--carb cyl--disp cyl--hp cyl--drat cyl--wt cyl--qsec cyl--vs cyl--am -0.55 0.90 0.83 -0.70 0.78 -0.59 -0.81 -0.52 ...
方法2:tidyverse工具实现
若需数据框格式结果,可将矩阵转为长格式后筛选下三角:
library(tidyverse) # 转换为长格式并筛选下三角 cor_df <- as.data.frame(cor.Mat) %>% rownames_to_column(var = "row") %>% pivot_longer(cols = -row, names_to = "col", values_to = "correlation") %>% filter(match(row, rownames(cor.Mat)) > match(col, colnames(cor.Mat))) %>% mutate(pair = paste(row, col, sep = "--")) %>% select(pair, correlation) # 可选:转换为命名向量 result_vec_tidy <- cor_df$correlation names(result_vec_tidy) <- cor_df$pair
内容的提问来源于stack exchange,提问作者some
相关产品推荐
相关产品推荐

