2012-04-06 33 views
2

all-vs-all比較からヒートマップを生成したい。私はすでにデータを0-1にスケーリングしています。しかし、私は比較のためだけに値を持っており、同じグループ(常に1)間の比較ではなく、つまり行列の半分を持ち、残りの半分と対角線を欠いています。 ヒートマップにggplot2が使用できる形式に変換するにはどうすればよいでしょうか?ggplot2でヒートマップをプロットするためのデータフレームを延長

これは私が持っているデータの一例である:

A B value 
T1 T2 0.347 
T1 T3 0.669 
T2 T3 0.214 

私は次は私がggplotのために必要なものであると仮定(またはggplotは何とかそれを生成することができれば、多分私は、ないですか?):

A B value 
T1 T2 0.347 
T1 T3 0.669 
T2 T3 0.214 
T2 T1 0.347 
T3 T1 0.669 
T3 T2 0.214 
T1 T1 1 
T2 T2 1 
T3 T3 1 

その後、私は私がこれを解決した

sorted<-data[order(data$A, data$B), ] 

ggplot(sorted, aes(A, B)) + 
    geom_tile(aes(fill = value), colour = "white") + 
    scale_fill_gradient(low = "black", high = "red") + 

を実行しますが、本当に悪い方法INVO(私があると仮定するもの)でしまいますループのためにlving。最初のデータフレームを2番目のデータフレームに変換するには、より良い方法が必要です。

乾杯

答えて

1

うーん...私は内蔵の既存のエレガントを想像することができますが、これはあなたのためのトリックを行う必要があります。

# Factors are not your friend here 
options(stringsAsFactors = FALSE) 

# Here's the data you're starting with 
this.half <- data.frame(A = c("T1", "T1", "T2"), 
         B = c("T2", "T3", "T3"), 
         value = c(0.347, 0.669, 0.214)) 


# Make a new data.frame, simply reversing A and B 
that.half <- data.frame(A = this.half$B, 
         B = this.half$A, 
         value = this.half$value) 

# Here's the diagonal 
diagonal <- data.frame(A = unique(c(this.half$A, this.half$B)), 
         B = unique(c(this.half$A, this.half$B)), 
         value = 1) 

# Mash 'em all together 
full <- rbind(this.half, that.half, diagonal) 
+0

感謝を!それは私のバージョンよりはるかに優れています。 Rはすべてサブセット化と結合についてですが、それは... – ShellfishGene

関連する問題