2012-04-06 4 views
2

all-vs-all 비교에서 히트 맵을 생성하고 싶습니다. 이미 0-1로 스케일 된 데이터가 있습니다. 그러나 한 가지 방법으로 만 비교할 수있는 값만 있고 같은 그룹 (항상 1)간에 비교할 수는 없습니다. 즉, 행렬의 절반이 있고 나머지 절반과 대각선이 누락되었습니다. ggplot2가 열지도 (heat map)에 사용할 수있는 형식으로 가져 오는 좋은 방법은 무엇입니까? 나는 다음과 같은 맡기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 

그럼 내가 정말 나쁜 방법 invo을 나는이 문제를 해결 한

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") + 

실행 만에 (내가 가정하는 것입니다) 것 루프를위한 lving. 위의 첫 번째 데이터 프레임을 양식으로 가져 오는 더 좋은 방법이 있어야합니다!

건배

답변

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

관련 문제