重构相关矩阵以按列对堆叠

时间:2014-02-05 15:52:39

标签: r matrix reshape

在R中,我使用cov2cor()计算相关矩阵,如:

  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被排除在外,A,B B,A被视为重复,因此排除了{{1}}。

有没有简单的方法来实现这个?

1 个答案:

答案 0 :(得分:7)

您需要的功能是:

lower.tri {base}:这将允许您获取相关矩阵并将上/下三角形设置为NA以及排除对角线。这将处理重复的corr值,即,仅保留其中一个。心病(A,C)= COR(C,A)

melt{reshape2}:这将采用下/上三角形并将其融入仅有三列的表格中。第3列将具有col1和amp;中变量之间的相关性。 COL2。

is.na{Matrix}:使用此选项删除第3列为NA的行。

更新:@KunRen认为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")