Подтвердить что ты не робот

Показывать корреляции как упорядоченный список, а не как большую матрицу

У меня есть кадр данных со 100 + столбцами. Кор() возвращает замечательно быстро, но слишком много говорит, особенно, поскольку большинство столбцов не коррелируются. Я бы хотел, чтобы он просто сказал мне пары столбцов и их корреляцию, идеально упорядоченные.

Если это не имеет смысла, это искусственный пример:

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

затем сканирование, которое ищет ненулевые значения. Но он намного уступает желаемому выходу выше.

UPDATE: На основании полученных ответов и некоторых проб и ошибок, вот решение, с которым я пошел:

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)
4b9b3361

Ответ 1

Я всегда использую

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) для выбора значимых значений.

Ответ 2

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

Ответ 3

Создание ответа @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 , ]