将相关性显示为有序列表,而不是大型矩阵

Dar*_*ook 31 r

我有一个包含100多列的数据框.cor()返回非常快,但告诉我太多,特别是因为大多数列不相关.我想它只是告诉我列对及其相关性,理想情况下是有序的.

如果没有意义,这是一个人为的例子:

df = data.frame(a=1:10,b=20:11*20:11,c=runif(10),d=runif(10),e=runif(10)*1:10)
z = cor(df)
Run Code Online (Sandbox Code Playgroud)

z看起来像这样:

           a          b           c           d          e
a  1.0000000 -0.9966867 -0.38925240 -0.35142452  0.2594220
b -0.9966867  1.0000000  0.40266637  0.35896626 -0.2859906
c -0.3892524  0.4026664  1.00000000  0.03958307  0.1781210
d -0.3514245  0.3589663  0.03958307  1.00000000 -0.3901608
e  0.2594220 -0.2859906  0.17812098 -0.39016080  1.0000000
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一个能告诉我的功能:

a:b -0.9966867 
b:c  0.4026664
d:e -0.39016080  
a:c -0.3892524 
b:d  0.3589663
a:d -0.3514245 
b:e -0.2859906
a:e  0.2594220 
c:e  0.17812098
c:d  0.03958307
Run Code Online (Sandbox Code Playgroud)

我有一个粗暴的方法来摆脱一些噪音:

z[abs(z)<0.5]=0
Run Code Online (Sandbox Code Playgroud)

然后扫描寻找非零值.但它远远低于上述所需的输出.

更新:根据收到的答案,以及一些试验和错误,这是我采用的解决方案:

z[lower.tri(z,diag=TRUE)]=NA  #Prepare to drop duplicates and meaningless information
z=as.data.frame(as.table(z))  #Turn into a 3-column table
z=na.omit(z)  #Get rid of the junk we flagged above
z=z[order(-abs(z$Freq)),]    #Sort by highest correlation (whether +ve or -ve)
Run Code Online (Sandbox Code Playgroud)

Mar*_*rek 33

我总是用

zdf <- as.data.frame(as.table(z))
zdf
#    Var1 Var2     Freq
# 1     a    a  1.00000
# 2     b    a -0.99669
# 3     c    a -0.14063
# 4     d    a -0.28061
# 5     e    a  0.80519
Run Code Online (Sandbox Code Playgroud)

然后使用subset(zdf, abs(Freq) > 0.5)选择重要值.

  • 谢谢.它仍然包括对角线,包括每个相关两次,并没有排序,但我用它作为我使用的解决方案的起点. (2认同)

Bra*_*sen 7

library(reshape)

z[z == 1] <- NA #drop perfect
z[abs(z) < 0.5] <- NA # drop less than abs(0.5)
z <- na.omit(melt(z)) # melt! 
z[order(-abs(z$value)),] # sort
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.`z [z == 1] < - NA`是危险的,因为它也消除了真正完美的相关性(更好地使用`z [lower.tri(z,diag = TRUE)] = NA`).BTW,在这种情况下,melt(z)与as.data.frame(as.table(z))完全相同(?),因此可以在没有其他包的情况下完成. (3认同)