【问题标题】:Is there a cleaner way to subset correlation matrices?有没有一种更简洁的方法来对相关矩阵进行子集化?
【发布时间】:2020-06-07 21:22:13
【问题描述】:

我正在尝试搜索高度相关的变量。我目前的代码是: 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) more 不止一次。我本来想输入类似的东西 0.8<cor(numericData)<1
  2. 给出的输出没有告诉我 相关变量的名称,这意味着我将拥有 将此输出与大量原始数据集进行交叉引用。

  3. 将此输出反馈给cor(numericData),即 cor(numericData)[which(cor(numericData)<1&cor(numericData)>0.8,arr.ind= TRUE)] 相当丑陋,并且丢失了有关数据来自哪些行/列的所有信息,并且只是吐出相关系数。

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

【问题讨论】:

  • 你为什么不能创建一个对象cor1 <- cor(numericData)然后重用那个对象out <- which(cor1 < 1 & cor1 > 0.8, arr.ind = TRUE); data.frame(rn = row.names(cor1)[out[,1], colnames(cor1)[out[,2])
  • @akrun 这确实把事情整理了一下,谢谢。

标签: r correlation


【解决方案1】:

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

tmp <- cor(numericData)

使用该对象获取行/列索引并对行/列进行子集化

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 类之后转换为data.frame,并根据'Freq' 列中的值转换为subset data.frame

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

【讨论】:

  • 所以 0.8
  • @J.Mini 如果你愿意使用between from dplyr
  • @J.Mini in R,该语法不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2019-10-29
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多