我有一些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个碱基,其余的在数据集的第一行中也是如此。但数据帧很长,我希望不是所有的读取都是单例。
答案 0 :(得分:4)
@jeremycg对dplyr的lag
和lead
做了同样的事情,但是在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]
对于数百万条记录来说,这将是快速的。