У меня есть фрейм данных со 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
затем сканировать, ища ненулевые значения. Но он намного ниже желаемого результата выше.
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)