[英]Optimize 2 nested for loops with GRanges
我正在尝试优化其中包含GRanges的2个嵌套循环。
我原来的GRanges是:
annot_cnv
GRanges object with 1733140 ranges and 3 metadata columns:
seqnames ranges strand | GENEID SAMPLE Segment_Mean
<Rle> <IRanges> <Rle> | <character> <character> <numeric>
chr1 [3301765, 44149504] + | 81569 TCGA-05-4433-01A-22D-1854-01 0.0889
chr1 [3301765, 44149504] + | 252995 TCGA-05-4433-01A-22D-1854-01 0.0889
chr1 [3301765, 44149504] + | 252995 TCGA-05-4433-01A-22D-1854-01 0.0889
chr1 [3301765, 44149504] + | 252995 TCGA-05-4433-01A-22D-1854-01 0.0889
chr1 [3301765, 44149504] + | 252995 TCGA-05-4433-01A-22D-1854-01 0.0889
和2个嵌套的for循环是:
cnv_data <- data.frame()
for (i in unique(annot_cnv$SAMPLE))
{
sample_data <- annot_cnv[annot_cnv$SAMPLE == i,]
for (j in unique(sample_data$GENEID))
{
cnv_data[i,j] <- mean(sample_data$Segment_Mean[sample_data$GENEID == j])
}
}
我正在尝试使用函数foreach,但是我不知道如何使用它在最终data.frame中将样本名称保留为行名,将GENEID保留为colnames。
有人可以帮助我优化这些循环以并行执行吗?
一般的策略是使用splitByList()
创建splitByList()
,然后调用mean()
; 它将计算列表中每个元素的平均值。 所以沿着
grp = interaction(annot_cnv$GENE_ID, annot_cnv$SAMPLE)
grl = splitAsList(annot_cnv, grp)
mean(grl)
最好在Biocondunctor支持网站上询问有关Bioconductor软件包的问题。
您不需要for-loop
。 使用dplyr
软件包的r
可用的许多选项之一可以是:
library(dplyr)
annot_cnv %>%
group_by(SAMPLE, GENEID) %>%
mutate(Avg = mean(Segment_Mean))
上面创建的Avg
列将包含您想要的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.