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

时间:2011-08-16 06:11:50

标签: 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)

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

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

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

我有一种粗暴的方法可以摆脱一些噪音:

z[abs(z)<0.5]=0

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

更新: 根据收到的答案以及一些反复试验,以下是我采用的解决方案:

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)

5 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

答案 2 :(得分:2)

建立@Marek的答案。 消除对角线和重复

data = as.data.frame( as.table( z ) )
combinations = combn( colnames( z ) , 2 , FUN = function( x ) { paste( x , collapse = "_" ) } )
data = data[ data$Var1 != data$Var2 , ]
data = data[ paste( data$Var1 , data$Var2 , sep = "_" ) %in% combinations , ]

答案 3 :(得分:1)

有几种方法可视化相关矩阵,以便人们可以快速了解数据集。这是一个link方法看起来很不错。

答案 4 :(得分:1)

从Marek的答案开始,我添加了几行用于使用Tidyverse pipes进行常规清洁的行:

  df_cor %>%                               # start from the correlation matrix
  as.table() %>% as.data.frame() %>%       # Marek's answer in TidyVerse format
  subset(Var1 != Var2 & abs(Freq)>0.5) %>% # omit diagonal and keep significant correlations (optional...)
  filter(!duplicated(paste0(pmax(as.character(Var1), as.character(Var2)), pmin(as.character(Var1), as.character(Var2))))) %>%
                                           # keep only unique occurrences, as.character because Var1 and Var2 are factors
  arrange(desc(Freq))                      # sort by Freq

第4行的更多信息:How do I select all unique combinations of two columns in an R data frame?