2

all-vs-allの比較からヒートマップを生成したいと思います。すでに0-1にスケーリングされたデータがあります。ただし、値は1つの方法での比較のみであり、同じグループ(常に1)間の比較ではありません。つまり、行列の半分があり、残りの半分と対角線が欠落しています。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") +

私はこれを解決しましたが、(私が想定していることですが)forループを含む本当に悪い方法です。上記の最初のデータフレームから2番目のデータフレームを形成するためのより良い方法があるはずです!

乾杯

4

1 に答える 1

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)
于 2012-04-06T17:23:48.063 に答える