2015-03-31 51 views
0

我在R中使用ggplot2在大約7000個條目的數據集中創建R中的HeatMap,但由於我繪製的圖例說明了「我」知道單個實例具有「Vol」值的結果,所以我感覺不舒服,而我想要繪製「星期幾」/「星期幾」組合的總量。在R中使用HeatMap GGPLOT2之前有條件地求和列?

所以我的新手假設是ggplot2不會自動聚合這些值,或者我在繪圖之前缺少某些東西。

基本上我希望在繪圖點或之前的所有217單元格上完成類似於以下內容的Excel。

=SUMIFS(C2:C9999,D2:D9999,"1",F2:F9999,"Wed")

這對是在星期三本月例如Excel的狀態是「6098822」和第一天的「6756753」爲上週四一個月的第一天;超過了下面HeatMap的最大密度。

最有可能我只是缺少一個基本的聚合函數來產生正確的聚合組合。

有人能指出我應該做什麼並且準確地解釋GGPLOT2正在做什麼,比如它是否使用了它爲劇情找到的第一個組合?

注:DOY - > 1365 DofM-> 1-31 DofW->週日至週六

我的數據如下所示:

> head(AC3,10) 
    DD  Date Vol DofM DoY DofW 
1 1 01/01/97 28857 1 1 Wed 
2 2 01/02/97 37757 2 2 Thu 
3 3 01/03/97 41394 3 3 Fri 
4 4 01/04/97 39614 4 4 Sat 
5 5 01/05/97 32735 5 5 Sun 
6 6 01/06/97 33536 6 6 Mon 
7 7 01/07/97 33547 7 7 Tue 
8 8 01/08/97 34205 8 8 Wed 
9 9 01/09/97 35804 9 9 Thu 
10 10 01/10/97 42895 10 10 Fri 


>p<-ggplot(AC3,aes(DofM,DofW)) 
>p + geom_tile(aes(fill=Vol)) + scale_fill_gradient(low="white", high="darkblue") + xlab("Day of Month") + ylab("Day of Week") 

這將產生圖:

enter image description here

回答

1

您可以測試ggplot正在做什麼b Ÿ設計數據以便輕鬆計算出ggplot如何處理它。

例如,下面是用於創建數據集的R代碼,該數據集在最後四行上具有重複的前4行。但是,對於重複的底部4行,Vol值是負值。運行此看到:

# take in data similar to what was show in question 
AC3<-scan(what=list(id=0,DD=0,Date="",Vol=0,DofM=0,DoY=0,DofW="")) 
1 1 01/01/97 28857 1 1 Wed 
2 2 01/02/97 37757 2 2 Thu 
3 3 01/03/97 41394 3 3 Fri 
4 4 01/04/97 39614 4 4 Sat 
5 5 01/01/97 -8857 1 1 Wed 
6 6 01/02/97 -7757 2 2 Thu 
7 7 01/03/97 -1394 3 3 Fri 
8 8 01/04/97 -9614 4 4 Sat 

#turn into data.frame for ggplot 
AC3<-as.data.frame(AC3) 

# do the plottin' 
require(ggplot2) 
ggp2 <- ggplot(AC3,aes(DofM,DofW)) 
ggp2 <- ggp2 + geom_tile(aes(fill=Vol)) 
ggp2 <- ggp2 + scale_fill_gradient(low="white",high="darkblue") 
ggp2 <- ggp2 + xlab("Day of Month") 
ggp2 <- ggp2 + ylab("Day of Week") 
print(ggp2) 

你可以看到ggplot只使用組合DofM,DofW最後Vol值。現在要完成您真正想要做的事情,請總結DofM,DofW組合的重複Vol值。我選擇的武器是Rsqldf(SQL數據框)。這是在R中使用SQL的一種方式。

# need to install sqldf: install.packages("sqldf",dep=TRUE) 
require(sqldf) 
# sql query to add all Vol values for unique DofM, DofW combinations 
AC4<-sqldf(paste("select DofM, DofW, sum(Vol) as newvol" 
       ,"from AC3" 
       ,"group by DofM, DofW" 
       )) 
# see if you agree with the output: 
print(AC4)