Tengo un marco de datos con más de 100 columnas. cor() vuelve notablemente rápido, pero me dice demasiado, especialmente porque la mayoría de las columnas no están correlacionadas. Me gustaría que me diga solo los pares de columnas y su correlación, idealmente ordenada.Mostrar las correlaciones como una lista ordenada, no como una matriz grande
En caso de que no tiene sentido aquí es un ejemplo artificial:
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 es el siguiente:
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
Lo que estoy buscando es una función que en su lugar se dirá me:
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
que tienen una forma cruda para deshacerse de algunos de los ruidos:
z[abs(z)<0.5]=0
luego escanee en busca de valores distintos de cero. Pero es muy inferior al resultado deseado anterior.
ACTUALIZACIÓN: Sobre la base de las respuestas recibidas, y un poco de ensayo y error, aquí está la solución Fui con:
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)
¿Duplicado? http://stackoverflow.com/q/6782070/210673 – Aaron
@ Aaron Sí, es exactamente la misma pregunta. ¡Mis disculpas! (Revisé la lista de Preguntas relacionadas, pero la olvidé por completo.) Pero es educativo (al menos para mí) señalar las similitudes y diferencias en las respuestas. –