我试图优化2个带有GRanges的嵌套for循环。
我原来的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函数,但我不知道如何使用它将样本名称保留为rownames,将GENEID保存为最终data.frame中的colnames。
有人可以帮我优化这些循环并行吗?
答案 0 :(得分:1)
一般策略是使用splitByList()
制作GRangesList,然后调用mean()
;它将计算列表中每个元素的平均值。
grp = interaction(annot_cnv$GENE_ID, annot_cnv$SAMPLE)
grl = splitAsList(annot_cnv, grp)
mean(grl)
最好在Biocondunctor support site上询问有关Bioconductor包的问题。
答案 1 :(得分:0)
您不需要for-loop
。使用r
包的dplyr
中提供的众多选项之一可以是:
library(dplyr)
annot_cnv %>%
group_by(SAMPLE, GENEID) %>%
mutate(Avg = mean(Segment_Mean))
上面创建的Avg
列将包含您想要的结果。