2016-04-29 7 views
2

mydistと呼ばれる距離行列があります。私は行列の下三角を列の値のペアごとの組み合わせに抽出したいと思います。たとえば、距離行列の下三角形をペアの列の値に抽出する方法

sampleA   sampleB    values 
S05-F13-P01_C S05-F13-P01_C   2251 
S08-F10-P01_C S08-F10-P01_C   2246 

です。 。そう

データ

mydist<-structure(c("2251", "1923", "2085", "1954", "2105", "0", "2246", 
"2094", "1955", "2127", "0", "0", "2521", "2110", "2329", "0", 
"0", "0", "2276", "2141", "0", "0", "0", "0", "2561"), .Dim = c(5L, 
5L), .Dimnames = list(c("S05-F13-P01_C", "S08-F10-P01_C", "S08-F11-P01_C", 
"S09-F66-P01_C", "S09-F67-P01_C"), c("S05-F13-P01_C", "S08-F10-P01_C", 
"S08-F11-P01_C", "S09-F66-P01_C", "S09-F67-P01_C"))) 
+0

'as.dist'は動作しますか? –

+0

@RichardTelfordペアワイズの組み合わせはありません – MAPK

答えて

2

に我々は

i1 <- lower.tri(mydist, diag=TRUE) 
i2 <- which(i1, arr.ind=TRUE) 
data.frame(sampleA = colnames(mydist)[i2[,1]], 
     sampleB = colnames(mydist)[i2[,2]], value = mydist[i1]) 
1

を試すことができますこれは動作するようです:

cbind(rownames(mydist)[which(lower.tri(mydist, diag=T), arr.ind=T)[,1]], 
     colnames(mydist)[which(lower.tri(mydist, diag=T), arr.ind=T)[,2]], 
     mydist[lower.tri(mydist, diag=T)]) 

あるいは、@akrunが行うようdata.frameに変換し:

temp1 <-data.frame(sampleA=rownames(mydist)[which(lower.tri(mydist, diag=T), arr.ind=T)[,1]], 
        sampleB=colnames(mydist)[which(lower.tri(mydist, diag=T), arr.ind=T)[,2]], 
        value=as.numeric(mydist[lower.tri(mydist, diag=T)]), stringsAsFactors=F) 
3

私は次のように考えています:

data.frame(as.table(mydist))[lower.tri(mydist, diag = TRUE), ] 
##    Var1   Var2 Freq 
## 1 S05-F13-P01_C S05-F13-P01_C 2251 
## 2 S08-F10-P01_C S05-F13-P01_C 1923 
## 3 S08-F11-P01_C S05-F13-P01_C 2085 
## 4 S09-F66-P01_C S05-F13-P01_C 1954 
## 5 S09-F67-P01_C S05-F13-P01_C 2105 
## 7 S08-F10-P01_C S08-F10-P01_C 2246 
## 8 S08-F11-P01_C S08-F10-P01_C 2094 
## 9 S09-F66-P01_C S08-F10-P01_C 1955 
## 10 S09-F67-P01_C S08-F10-P01_C 2127 
## 13 S08-F11-P01_C S08-F11-P01_C 2521 
## 14 S09-F66-P01_C S08-F11-P01_C 2110 
## 15 S09-F67-P01_C S08-F11-P01_C 2329 
## 19 S09-F66-P01_C S09-F66-P01_C 2276 
## 20 S09-F67-P01_C S09-F66-P01_C 2141 
## 25 S09-F67-P01_C S09-F67-P01_C 2561 
+0

これは良い1行のオプションです。 – akrun

関連する問題