【发布时间】:2014-05-27 07:49:27
【问题描述】:
我正在尝试组合来自多个数据框的信息来填充一个大数据框。第一个数据框就像是对所有人类基因的概述:
gene_id chromosome gene_start gene_end
ENSG00000116396 1 110753965 110825722
ENSG00000228217 1 118320709 118321128
ENSG00000261716 1 149816065 149820591
ENSG00000223562 1 211355498 211356446
ENSG00000239859 1 36171626 36171875
ENSG00000197921 1 2460184 2461684
ENSG00000232237 1 201083081 201096312
ENSG00000212257 1 65488651 65488757
ENSG00000158887 1 161274525 161279762
ENSG00000238122 1 108803818 108816311
ENSG00000215846 1 159246293 159247282
ENSG00000266763 1 26238240 26238313
ENSG00000228634 1 32398621 32399576
ENSG00000177614 1 230457392 230561475
ENSG00000163462 1 155145873 155157447
ENSG00000204481 1 13668269 13673511
其次,我有许多文件(其中 516 个),包含如下数据:
Sample Chromosome Start End Num_Probes Segment_Mean
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 61735 82170 9 0.2560
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 82315 16869363 8678 -0.1199
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 16871278 17087292 85 -0.5386
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 17089349 17209603 23 -0.0807
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 17210652 17262232 57 0.2680
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 17262247 25583341 5240 -0.1228
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 25593128 25646986 28 -1.8216
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 25661501 30738534 2398 -0.0942
UNDID_p_TCGA_353_354_355_37_NSP_GenomeWideSNP_6_H10_1376930 1 30739299 30745210 7 -1.3117
现在,我想创建某种循环,以获取第一个数据框中的每个基因。然后我想在检查基因位置的同时遍历所有 516 个数据帧。
所以对于每个基因和每个文件,我想将基因的开始和结束与每个样本片段的开始和结束进行比较,前提是它们在同一条染色体上。如果是这种情况,我想取段均值并将其放入一个新的大数据框中,其中gene_id 作为行名,文件名作为列名。
这是我已有的代码:
for(gene in 1:100){
gene_id <- genome[gene, 1]
chromosome <- genome[gene, 2]
gene_start <- genome[gene, 3]
gene_end <- genome[gene, 4]
for(name in 1:length(dataframe_names)){
df <- get(dataframe_names[name])
for(segment in 1:nrow(df)){
if(chromosome == as.character(df[segment,2])){
if(gene_start > df[segment,3] && gene_start < df[segment,4] && gene_end > df[segment,3] && gene_end < df[segment,4]){
data_matrix[gene,name] <- df[segment, 6]
}
}
}
}
}
此代码有效,但考虑到有 57 773 个基因,它确实很慢。 100 个基因的测试运行需要 1 小时,因此完整的运行可能需要 2-3 周...
我认为使用apply-family 会加快速度,但我以前从未使用过它们,所以我真的不知道该怎么做。网上的例子总是使用sum或mean之类的东西,但我不想这样的东西,我只是想比较数字。另外,我不知道apply-family 中的哪一个最适合我的需求。
你们想帮助我还是走上正轨?
【问题讨论】:
-
这将有助于在您的示例中提供与基因重叠的 snp 片段,并澄清您是否期望每个基因不超过 1 个 snp 片段(这通过使用“gene_id”作为行来暗示。名称,因为 row.names 应该是唯一的)。
-
@Arun -- 我不明白您编辑 Sample 列的目的;看起来这些标识符是有意义的,并且只会通过使它们“漂亮”来引入错误。
-
@MartinMorgan,在此示例中,所有标识符都是相同的。因此,不确定它会在“此示例数据”中引入哪些错误。你能详细说明一下吗?
-
@Arun - 这似乎是一个毫无意义的编辑,丢失了对 OP 很重要的信息。如果身份很重要,并且都是相同的,那么合乎逻辑的做法就是完全删除它们!此外,如果您对这篇文章投了反对票,那么请重新考虑或至少证明这一点——OP 提供了一个可合理重现的示例和问题,即使乍一看标题看起来像是许多其他 StackOverflow 问题的重复。可能 cmets 部分不适合进行这些对话,非常抱歉。
-
@Arun,我知道这些标识符是相同的。这是构建这些文件的方式。这些文件不是我创建的,而是以这种格式下载的。