繁体   English   中英

使用GRanges优化2个嵌套循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM