使用GRanges优化2个嵌套for循环

时间:2018-04-22 19:05:05

标签: r for-loop foreach bioconductor parallel-foreach

我试图优化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。

有人可以帮我优化这些循环并行吗?

2 个答案:

答案 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列将包含您想要的结果。