簡體   English   中英

R - 將相關矩陣轉換為成對

[英]R - converting correlation matrix to pairwise

我想將相關矩陣轉換為成對表(刪除自匹配和重復)。

這是一個示例數據集。

rmat.test<-structure(c(1, 0.861194908618927, 0.826931774616241, 0.796892821788788, 
0.83096307516098, 0.861194908618927, 1, 0.878752708435059, 0.855243384838104, 
0.880544185638428, 0.826931774616241, 0.878752708435059, 1, 0.850607931613922, 
0.850719928741455, 0.796892821788788, 0.855243384838104, 0.850607931613922, 
1, 0.876053333282471, 0.83096307516098, 0.880544185638428, 0.850719928741455, 
0.876053333282471, 1), .Dim = c(5L, 5L), .Dimnames = list(c("A", 
"B", "C", "D", "E"), c("A", "B", "C", "D", "E")))

來自上一篇文章的答案。 我有以下代碼。

df.corr.pw<-reshape2::melt( cbind(
  V1=rownames(rmat.test), 
  as.data.frame(rmat.test))
)
df.corr.pw<-subset(df.corr.pw,value!=1)

但是,我無法找到一種有效的方法來刪除重復的條目(即AB的第2行和BA的第6行)。

> df.corr.pw
   V1 variable     value
2   B        A 0.8611949
3   C        A 0.8269318
4   D        A 0.7968928
5   E        A 0.8309631
6   A        B 0.8611949
8   C        B 0.8787527
9   D        B 0.8552434
10  E        B 0.8805442
11  A        C 0.8269318
12  B        C 0.8787527
14  D        C 0.8506079
15  E        C 0.8507199
16  A        D 0.7968928
17  B        D 0.8552434
18  C        D 0.8506079
20  E        D 0.8760533
21  A        E 0.8309631
22  B        E 0.8805442
23  C        E 0.8507199
24  D        E 0.8760533

我只是使用upper.triangle嘗試了這個,但我無法弄清楚如何保留和使用rownames。

rmat.up<-rmat.test[upper.tri(rmat.test)]
# below yields NULL
rownames(rmat.test[upper.tri(rmat.test)])

謝謝,任何幫助表示贊賞。

你可以嘗試(不使用你的功能)

rmat.test[lower.tri(rmat.test,diag=TRUE)]=NA # put NA
rmat.test<-as.data.frame(as.table(rmat.test)) # as a dataframe
rmat.test<-na.omit(rmat.test) # remove NA
rmat.test<-rmat.test[with(rmat.test, order(-Freq)), ] # order by correlation

rmat.test
   Var1 Var2      Freq
22    B    E 0.8805442
12    B    C 0.8787527
24    D    E 0.8760533
6     A    B 0.8611949
17    B    D 0.8552434
23    C    E 0.8507199
18    C    D 0.8506079
21    A    E 0.8309631
11    A    C 0.8269318
16    A    D 0.7968928

另一種方式:

tmp <- melt(rmat.test) 
tmp <- data.frame(t(apply(tmp, 1, sort)))
tmp <- tmp[duplicated(tmp[, 1 : 2], MARGIN = 1), ]
tmp[, 3 : 1]

  # X3 X2        X1
#6   B  A 0.8611949
#11  C  A 0.8269318
#12  C  B 0.8787527
#16  D  A 0.7968928
#17  D  B 0.8552434
#18  D  C 0.8506079
#21  E  A 0.8309631
#22  E  B 0.8805442
#23  E  C 0.8507199
#24  E  D 0.8760533

你先融化,然后將字母組合排序,挑選出重復對后來與duplicated

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM