我对以下数据中的测序数据进行了基准测试:
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))
答案 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-pipeslibrary(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}}。
有点推测,您可能会发现[
对全局坐标(您的开始/结束列)和本地坐标(位置)之间的映射很有帮助。