我有一个I / GRanges Views对象
**它是数据的简化版本,实际数据是巨大的
Views on a 10000000-length Rle subject
views:
start end width
[1] 1 1000 1000 [100 100 100 100 100 100 100 100 100 100 ...]
[2] 1001 2000 1000 [190 190 190 190 190 190 190 190 190 190 ...]
[3] 2001 3000 1000 [280 280 280 280 280 280 280 280 280 280 ...]
[4] 3001 4000 1000 [370 370 370 370 370 370 370 370 370 370 ...]
[5] 4001 5000 1000 [460 460 460 460 460 460 460 460 460 460 ...]
... ... ... ... ...
[9996] 995001 9996000 9001000 [89650 89650 89650 89650 89650 89650 ...]
[9997] 996001 9997000 9001000 [89740 89740 89740 89740 89740 89740 ...]
[9998] 997001 9998000 9001000 [89830 89830 89830 89830 89830 89830 ...]
[9999] 998001 9999000 9001000 [89920 89920 89920 89920 89920 89920 ...]
[10000] 999001 10000000 9001000 [90010 90010 90010 90010 90010 90010 ...]
每个视图(行)的宽度为1000,表示1000个数据点,每个数据点为100。 现在,我想将数据点集合分成20个区间(在这种情况下,每个区域50个),然后取平均值,因此输出将是20个数字的向量,每个数字是该区间的平均值。
输出:
[1] 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
现在,在实际情况中,我有超过20个这样的视图,每行的宽度不同,有些行> 5K。我的代码运行正常,但速度很慢,对于我的数据,对于每一行,返回20个二进制数的向量,需要大约1.5秒,我有> 30K行,大约12.5小时。
我确信,有一些方法可以固定这些计算,如果不是,我可以以某种方式使用我的集群的并行节点。你有什么建议。
library('GenomicRanges')
# generating data frame
df=data.frame(chrom=rep('Chr1',100000),start=seq(1,1000000,by=1000),end=seq(1000,10000000,by=1000),strand=rep("+",100000))
# making GRanges object
gr=GRanges(seqnames=as.vector(df[,1]),IRanges(start=df[,2],end=df[,3]),strand=df[,4])
# obtaining coverage using function coverage in the form of RLE object
gr.cov=coverage(gr)
# generating views for specific start and end
gr.views=Views(gr.cov[[1]],start=seq(1,1000000,by=1000),end=seq(1000,10000000,by=1000))
# putting in temp variable
d=gr.views
# this following code calculates the matrix (where each line is 20 points) for 10 lines
# reduce or increase the number in the outermost sapply loop to increase/decrease the lines to be calculated
sapply(1:10,function(j)
sapply(1:20,
function(i)as.numeric(
format(
mean(
as(d[[j]][(
seq(0,length(d[[j]]),floor(length(d[[j]])/20))+1)[i]:
c((seq(0,length(d[[j]]),floor(length(d[[j]])/20)))[
-length((seq(0,length(d[[j]]),floor(length(d[[j]])/20))))
],length(d[[j]]))[i+1]],
"RangedData")$score),
digits=2)
)
)
)
答案 0 :(得分:1)
为什么不根据要进行计算的窗口创建视图,然后使用viewSums
或viewMaxs
之类的内容来计算视图的统计信息,而不是基于基因创建视图?假设你有GRanges
描述'基因'的开始和结束(成绩单?)
genes <- GRanges(seqnames, IRanges(geneStarts, geneEnds))
您可以使用
来开始和结束窗口n <- 50L
starts0 <- Map(function(...) floor(seq(...)), start(genes), end(genes),
MoreArgs=list(length.out=n + 1L))
ends <- lapply(starts0, function(x) floor(x)[-1])
starts <- lapply(starts0, function(x) x[-length(x)])
然后创建您的视图
v <- Views(gr.cov[[1]], start=unlist(starts), end=unlist(ends))
(请参阅?RleViews
了解“视图,RleList方法”)计算统计数据并按基因分割
split(viewMeans(v), rep(seq_along(genes), each=n))
询问Bioconductor mailing list可能会带来许多聪明的解决方案。
v
是“RleViews”类的一个实例; v[[1]]
是Rle
的一个实例。您可以将mean(v[[1]])
计算为viewMeans
的确认,或者更进一步,将v[[1]]
强制转换为普通旧向量并计算mean(as.vector(v[[1]])))
。 runValue(v[[1]])
(与v[[1]]@values
相同,但使用适当的访问器,而不是在引擎盖下偷看)返回Rle中的值,例如,
> (x <- Rle(c(rep(100, 10), rep(200, 10))))
numeric-Rle of length 20 with 2 runs
Lengths: 10 10
Values : 100 200
> runValue(x)
[1] 100 200
> runLength(x)
[1] 10 10
显然是mean(runValue(x)) != mean(x)
。