计算R中单例的数量

时间:2015-09-29 17:15:14

标签: r bioinformatics

我有一些RNA-seq数据,我需要计算单个数。我们将单例定义为一个读取,其中没有任何其他读取映射在附近(在任何一侧的100个碱基的距离内)。

我有一个数据框,其中包含每个读取的开始坐标和结束坐标。我正在用R来做这件事。

我暂时写了这段代码,但是申请不正确,因此给出了错误。

mysql_upgrade -u -p

数据框的第一行是:

begin_end <- data.frame(begin_coordinate, final_coordinate)
apply(begin_end, 1, function(x) x[,1]-(x-1)[,2])

第一个似乎是单例,因为下一个读取在结束后开始超过100个碱基,其余的在数据集的第一行中也是如此。但数据帧很长,我希望不是所有的读取都是单例。

3 个答案:

答案 0 :(得分:4)

@jeremycg对dplyr的laglead做了同样的事情,但是在data.table中:

library(data.table)
setDT(begin_end)

begin_end[{
  d = begin - shift(final, type="lag")
  pmin(d, shift(d, type="lead"), na.rm=TRUE) > 100
}]

评论。基本data.table语法为DT[i,j]i用于过滤输入,而j用于修改输出。

我们上面使用了i,但为了检查它是如何工作的,我们可以将相关的向量投入j

begin_end[,{
  d       = begin - shift(final, type="lag")
  d_lead  = shift(d, type="lead")
  my_pmin = pmin(d, d_lead, na.rm=TRUE)
  c(.SD, list(d = d, d_lead = d_lead, my_pmin = my_pmin))
}]

#    begin final    d d_lead my_pmin
# 1: 60507 60551   NA    239     239
# 2: 60790 60840  239   1164     239
# 3: 62004 62051 1164    768     768
# 4: 62819 62868  768   2273     768
# 5: 65141 65187 2273     NA    2273

.SD是表中已有的列向量列表,是数据子集的缩写。

答案 1 :(得分:3)

您似乎尝试使用apply(x-1)获取前一个结束值。不幸的是,你不能在申请家庭中这样做。

幸运的是,有一个名为lag的函数(有几个,所以我将使用dplyr中的一个)。这允许我们lag按给定数量的条目列出一列:

begin_end$space <- begin_end$begin - dplyr::lag(begin_end$final)

这是输出:

  begin final space
1 60507 60551    NA
2 60790 60840   239
3 62004 62051  1164
4 62819 62868   768
5 65141 65187  2273

然后你可以尝试:

begin_end$issingle <- begin_end$space >= 100

答案 2 :(得分:3)

使用Bioconductor&#39; GenomicRanges我认为我的想法是创建GRanges()(可能是使用GenomicAlignments::readGAlignments()或{{1}来阅读数据}}从您的阅读中,使用makeGRangesFromDataFrame()在每个方向上扩展它们,然后使用resize()将单例识别为仅与自身重叠的读取。大致

findOverlaps()

导致

library(GenomicRanges)
gr = GRanges(seqnames="chr1",
             IRanges(start=c(1000, 1150, 1500), width=100))
gr100 = resize(gr, width(gr) + 200, fix="center")
hits = findOverlaps(gr100)
gr100[tabulate(queryHits(hits), queryLength(hits)) == 1]

对于数百万条记录来说,这将是快速的。