有没有更简洁的方法来对相关矩阵进行子集化?

Is there a cleaner way to subset correlation matrices?

我正在尝试搜索高度相关的变量。我当前的代码是: which(cor(numericData)<1&cor(numericData)>0.8,arr.ind = TRUE) 这给出了输出:

             row col
VarAlice     20   5
VarBob       11  10
VarCoco      10  11
Year          5  20

我对此有很多问题:

  1. 要获得此输出,我必须再输入 cor(numericData) 不止一次。我本来想输入类似的东西 0.8<cor(numericData)<1.
  2. 给出的输出没有告诉我 相关变量的名称,这意味着我将拥有 将此输出与大量原始数据集交叉引用。

  3. 将此输出反馈给 cor(numericData),即 cor(numericData)[which(cor(numericData)<1&cor(numericData)>0.8,arr.ind= TRUE)] 相当难看,丢失了有关 rows/columns 数据来源的所有信息,只吐出相关系数。

有没有更好的方法?我理想的输出是 cor(numericData) 的一个子集,它只显示相关的相关系数,并且具有识别它们所需的 row/column 个名称。在这个特定的案例中,很明显 varAlice 似乎与 Year 密切相关,但如果我有 50 个以上的变量,那就更难看出了,就像我的用例一样。

更好的选择是使用 cor 输出创建一个临时对象

tmp <- cor(numericData)

使用该对象获取 row/column 索引并子集 rows/columns

rc <- which(tmp < 1 & tmp > 0.8, arr.ind = TRUE)
out <- data.frame(rn = row.names(tmp)[rc[,1]], cn = colnames(tmp)[rc[,2]]) 

并删除 'tmp'

rm(tmp)

或者不创建任何临时对象的另一种选择是在创建 table class 之后转换为 data.frame,并且 subset 基于 data.frame 'Freq' 列中的值

subset(as.data.frame.table(cor(numericData)), Freq < 1 & Freq > 0.8)

mtcars

的可重现示例
subset(as.data.frame.table(cor(mtcars)), Freq < 1 & Freq > 0.8)
#   Var1 Var2      Freq
#14 disp  cyl 0.9020329
#15   hp  cyl 0.8324475
#24  cyl disp 0.9020329
#28   wt disp 0.8879799
#35  cyl   hp 0.8324475
#58 disp   wt 0.8879799

或者用between

library(dplyr)
as.data.frame.table(cor(mtcars)) %>% 
     filter(data.table::between(Freq, 0.8, 1, incbounds = FALSE))
# Var1 Var2      Freq
#1 disp  cyl 0.9020329
#2   hp  cyl 0.8324475
#3  cyl disp 0.9020329
#4   wt disp 0.8879799
#5  cyl   hp 0.8324475
#6 disp   wt 0.8879799