ggplot2条形图的子集data.frame

Mat*_*eck 5 r 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
...       ...   ...
Run Code Online (Sandbox Code Playgroud)

我想得到一个条形图,可视化每个接头对的比例,但仅适用于比例超过,例如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();
Run Code Online (Sandbox Code Playgroud)

但这只是给我一个条形图,其中Y轴上的所有接头对,除了过滤掉的接头对缺少条形图. 在此输入图像描述

我不知道发生了什么让所有类别仍然存在:s

jor*_*ran 6

发生的事情是Splice.Pair是一个因素.当您对数据框进行子集化时,该系数会保留其级别属性,该属性仍具有所有原始级别.只需将子集包装在droplevels以下内容中即可避免此类问题:

nc.subset <- droplevels(subset(nc.dat, proportion > 0.004))
Run Code Online (Sandbox Code Playgroud)

更一般地说,如果您不喜欢使用因子自动保留这种级别,您可以设置R将字符串存储为字符向量而不是默认设置的因素:

options(stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

在你的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
}
Run Code Online (Sandbox Code Playgroud)

但当然,最好的解决方案仍然是升级到最新版本的R.