2011-08-12 52 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,但是这是为你找到你:-)