You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取相关矩阵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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:20:24