2014-02-05 4 views
2

В R, я использую cov2cor() для вычисления корреляционной матрицы, как:Reshape корреляционная матрица для штабелирования парами колонн

A,B,C,... 
A 1,0.5,0.2,... 
B 0.5,1,0.4,... 
C 0.2,0.4,1,... 
... 

Как можно изменить форму матрицы, так что столбцы уложены в строки, как:

X,Y,Correlation 
A,B,0.5, 
A,C,0.2, 
... 
B,C,0.4, 
... 

A,A Напомним, что s исключены, и A,BB,A рассматриваются как дубликаты, так что один исключены.

Есть ли простой способ реализовать это?

+0

не знаю, как принять ваше предложение отредактировать, так вручную обновил свой ответ. –

ответ

5

Функции, которые вам нужны:

lower.tri {base}: Это позволит вам принять корреляционную матрицу и установить верхний/нижний треугольник ВПЛ, а также исключить диагонали. Это позаботится о повторяющихся значениях корр., Т. Е. Только один из них будет сохранен. cor (A, C) = cor (C, A)

melt{reshape2}: Это займет нижний/верхний треугольник и тает его в стол с тремя колонками. Третий столбец будет иметь корреляцию между переменной в col1 & col2.

is.na{Matrix}: Используйте это, чтобы удалить строки, где третий столбец NA.

Update: @KunRen имеет suggesed na.omit{base} в качестве лучшей альтернативы is.na, который я согласен с.

Образец решение будет иметь следующий вид:

system.time(correlations<-cor(mydata,use="pairwise.complete.obs"))#get correlation matrix 
upperTriangle<-upper.tri(correlations, diag=F) #turn into a upper triangle 
correlations.upperTriangle<-correlations #take a copy of the original cor-mat 
correlations.upperTriangle[!upperTriangle]<-NA#set everything not in upper triangle o NA 
correlations_melted<-na.omit(melt(correlations.upperTriangle, value.name ="correlationCoef")) #use melt to reshape the matrix into triplets, na.omit to get rid of the NA rows 
colnames(correlations_melted)<-c("X1", "X2", "correlation") 
Смежные вопросы