有没有更简洁的方法来对相关矩阵进行子集化?
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
我对此有很多问题:
- 要获得此输出,我必须再输入
cor(numericData)
不止一次。我本来想输入类似的东西
0.8<cor(numericData)<1
.
给出的输出没有告诉我
相关变量的名称,这意味着我将拥有
将此输出与大量原始数据集交叉引用。
将此输出反馈给 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
我正在尝试搜索高度相关的变量。我当前的代码是:
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
我对此有很多问题:
- 要获得此输出,我必须再输入
cor(numericData)
不止一次。我本来想输入类似的东西0.8<cor(numericData)<1
. 给出的输出没有告诉我 相关变量的名称,这意味着我将拥有 将此输出与大量原始数据集交叉引用。
将此输出反馈给
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