2011-08-12 100 views
5

,我有以下數據:子data.frame爲GGPLOT2條形圖

Splice.Pair proportion 
1   AA-AG 0.010909091 
2   AA-GC 0.003636364 
3   AA-TG 0.003636364 
4   AA-TT 0.007272727 
5   AC-AC 0.003636364 
6   AC-AG 0.003636364 
7   AC-GA 0.003636364 
8   AC-GG 0.003636364 
9   AC-TC 0.003636364 
10  AC-TG 0.003636364 
11  AC-TT 0.003636364 
12  AG-AA 0.010909091 
13  AG-AC 0.007272727 
14  AG-AG 0.003636364 
15  AG-AT 0.003636364 
16  AG-CC 0.003636364 
17  AG-CT 0.007272727 
...  ... ... 

我希望得到一個條形圖可視化的每個接頭對的比例,但僅適用於具有一定比例以上,比如拼接對, 0.004。我試過如下:

nc.subset <- subset(nc.dat, proportion > 0.004) 
qplot(Splice.Pair, proportion, data=nc.dat.subset,geom="bar", xlab="Splice Pair", ylab="Proportion of total non-canonical splice sites") + coord_flip(); 

但這只是給了我一個條形圖與Y軸的所有接頭對,除了被濾出的拼接對遺漏的吧。 enter image description here

我不知道發生了什麼事,讓所有類別仍然存在:■

回答

6

發生了什麼事是Splice.Pair是一個因素。當您對數據框進行子集化時,該因子將保留它的levels屬性,該屬性仍具有所有原始級別。您可以通過簡單地包裝一下你的子集在droplevels避免這樣的問題:

nc.subset <- droplevels(subset(nc.dat, proportion > 0.004)) 

更一般地,如果你不喜歡這種用因素水平的自動保留,您可以設置R鍵存儲字符串作爲特徵向量,而不是因素默認設置:

options(stringsAsFactors = FALSE) 

在您的R對話的開始(這也可以作爲一個選項data.frame傳遞以及)。

編輯

對於運行舊版本[R可能缺乏droplevels的問題,@rcs指出了一個意見,即對單個因素的方法是你自己很容易實現。數據幀的方法僅僅是稍微複雜一些:

function (x, except = NULL, ...) 
{ 
    ix <- vapply(x, is.factor, NA) 
    if (!is.null(except)) 
     ix[except] <- FALSE 
    x[ix] <- lapply(x[ix], factor) 
    x 
} 

當然但是,最好的解決辦法仍然是升級到R的最新版本

+0

感謝您的解釋。但是,我似乎沒有功能液滴... – MattLBeck

+0

@kikumbob - 它是在一個(現在不是最近的)R更新,2.12.0我相信。我會檢查你正在運行升級的版本。如果你不能,在'gdata'包中有一個類似的函數'drop.levels'。 – joran

+1

+1正確的答案。但我個人認爲改變'選項'是不明智的,因爲這意味着你的代碼變得不易轉移給其他人。 – Andrie

1

檢查Splice.Pair是否是一個因素。如果是這種情況,請使用droplevels()刪除不再用於解決問題的級別。

nc.subset <- subset(nc.dat, proportion > 0.004) 
nc.subset$Splice.Pair <- droplevels(nc.subset$Splice.Pair) 
qplot(Splice.Pair, proportion, data=nc.dat.subset,geom="bar", xlab="Splice Pair", ylab="Proportion of total non-canonical splice sites") + coord_flip(); 

您可以納入到droplevelsqlot,但是這是爲你找到你:-)