dplyr总结了Rle

时间:2015-07-09 02:45:36

标签: r dplyr

我对以下数据中的测序数据进行了基准测试:

chr    start      end               geneID score strand postion coverage
1  chr1  3054232  3054733 ENSMUSG00000090025.1     0      +       1        0
2  chr1  3054232  3054733 ENSMUSG00000090025.1     0      +       3        0
3  chr1  3054232  3054733 ENSMUSG00000090025.1     0      +       5        0
4  chr1  3054232  3054733 ENSMUSG00000090025.1     0      +       7        0
5  chr1  3054232  3054733 ENSMUSG00000090025.1     0      +       9        0
6  chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     297        1
7  chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     299        1
8  chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     301        1
9  chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     303        1
10 chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     305        1
11 chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     307        1
12 chrY 90838868 90839177 ENSMUSG00000096850.1     0      -     309        1

我正在尝试使用dplyr获取数据框,命名列表或类似地将“geneID”与覆盖范围的Rle匹配。我一直在尝试下面代码的变体,但无法让它工作。有没有人有建议?

library(dplyr)
library(S4Vectors)    
group_by(df, geneID) %>% summarise(run_len = Rle(coverage))

2 个答案:

答案 0 :(得分:0)

注意 - 我正在使用rle而非Rle因为我没有来自Bioconductor的S4Vectors包,所以如果输出对象不同,你可能需要修改它。

请注意,因为rle没有返回一个可以很好地“混合”到数据帧中的单个单元格中的值(它存储运行值和运行长度,并且您可能有多次运行而不仅仅是每个基因一个),你应该得到一个列表作为输出而不是数据帧。

您可以使用plyr

执行此类操作
library(plyr)
# data is in x
o <- dlply(x, .(geneID), function (dd) rle(dd$coverage))

o是一个包含一些额外属性的列表。 names(o)是你基因的名字; o[[genename]]是该基因rle(x$coverage)的输出。

e.g。

o[[1]]
Run Length Encoding
  lengths: int 5
  values : num 0
# o[[1]]$lengths gives the lengths of each run
# o[[1]]$values gives the values of each run.

答案 1 :(得分:0)

您似乎想要计算每个基因内的覆盖率,而不是每个染色体上的覆盖率。所以

library(GenomicRanges)
gr = with(df, GRanges(geneID, IRanges(postion, width=1),   
                      coverage=coverage))
coverage(gr, weight=gr$coverage)

> gr
GRanges object with 12 ranges and 1 metadata column:
                   seqnames     ranges strand   |  coverage
                      <Rle>  <IRanges>  <Rle>   | <integer>
   [1] ENSMUSG00000090025.1     [1, 1]      *   |         0
   [2] ENSMUSG00000090025.1     [3, 3]      *   |         0
   [3] ENSMUSG00000090025.1     [5, 5]      *   |         0
   [4] ENSMUSG00000090025.1     [7, 7]      *   |         0
   [5] ENSMUSG00000090025.1     [9, 9]      *   |         0
   ...                  ...        ...    ... ...       ...
   [8] ENSMUSG00000096850.1 [301, 301]      *   |         1
   [9] ENSMUSG00000096850.1 [303, 303]      *   |         1
  [10] ENSMUSG00000096850.1 [305, 305]      *   |         1
  [11] ENSMUSG00000096850.1 [307, 307]      *   |         1
  [12] ENSMUSG00000096850.1 [309, 309]      *   |         1
  -------
  seqinfo: 2 sequences from an unspecified genome; no seqlengths
> coverage(gr, weight=gr$coverage)
RleList of length 2
$ENSMUSG00000090025.1
integer-Rle of length 9 with 1 run
  Lengths: 9
  Values : 0

$ENSMUSG00000096850.1
integer-Rle of length 309 with 14 runs
  Lengths: 296   1   1   1   1   1   1   1   1   1   1   1   1   1
  Values :   0   1   0   1   0   1   0   1   0   1   0   1   0   1

拥有GRanges后,您可以使用带有

的magrittr-pipes
library(magrittr)
> library(magrittr)
> gr %>% coverage(weight="coverage")
RleList of length 2
$ENSMUSG00000090025.1
integer-Rle of length 9 with 1 run
  Lengths: 9
  Values : 0

$ENSMUSG00000096850.1
integer-Rle of length 309 with 14 runs
  Lengths: 296   1   1   1   1   1   1   1   1   1   1   1   1   1
  Values :   0   1   0   1   0   1   0   1   0   1   0   1   0   1

使用seqinfo= GRanges()参数来提供每个基因的宽度也是有意义的(否则覆盖范围只是最后覆盖的基础,而不是结束基因)。

通常,Bioconductor数据对象与dplyr不兼容(如上所述,使用管道%>%)和传统data.frame()表示没有问题。这是因为data.frame()和dplyr没有实现特定的API(例如,“具有length()和1维[方法的任何对象都可以是列。”这种数据实现API周围的结构是Bioconductor中IRanges基础结构的标志,例如,DataFrame()类的行为类似于data.frame(),但允许任何类型的列,只要它实现length()和{{} 1}}。

有点推测,您可能会发现[对全局坐标(您的开始/结束列)和本地坐标(位置)之间的映射很有帮助。