我有一个巨大的data.frame,具有约300万行和100列。在这些列之一中,有关于ID的信息。我需要创建一个R脚本,该脚本可用于基于该ID生成新的data.frame。基本上,这个新的data.frame将只包含找到此ID的行以及大data.frame中的其余列,以及需要根据ID column
中包含的信息创建的一些额外的列。最终的想法是将其实现到一个闪亮的应用程序中,因此用户可以键入名称ID,然后将新的data.frame可视化。
这是我的数据外观的一个示例。这将是我需要按示例拆分的大data.frame:
Chr Start End Ref Alt Callers GATK_Illumina.counts GATK_Illumina.samples GATK_SOLiD.counts GATK_SOLiD.samples LIFE_SOLiD.counts LIFE_SOLiD.samples TVC_Ion.counts TVC_Ion.samples Func.refGene
1 14653 14653 C T GATK_Illumina 5.38 17J965(het)23;19;4;VQSRTrancheSNP99.90to100.00|17L166(het)10;5;5;VQSRTrancheSNP99.00to99.90|1H321(het)7;4;3;VQSRTrancheSNP99.90to100.00|1K210(het)15;9;6;VQSRTrancheSNP99.00to99
1 14677 14677 G A GATK_Illumina 2.38 1H321(het)16;6;10;VQSRTrancheSNP99.90to100.00|1K210(het)24;18;6;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_ex
1 14815 14815 C T GATK_Illumina 1.38 1H321(het)14;12;2;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_exonic;downstream WASH7P;DDX11L1 dist=406
1 14825 14825 G A GATK_Illumina 1.38 1H321(het)13;11;2;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_exonic;downstream WASH7P;DDX11L1 dist=416
1 14907 14907 A G GATK_Illumina 6.38 17J965(het)57;40;17;VQSRTrancheSNP99.90to100.00|17L166(het)26;15;11;VQSRTrancheSNP99.00to99.90|1H321(het)27;14;13;VQSRTrancheSNP99.90to100.00|1K210(het)42;24;18;VQSRTrancheSNP9
1 14930 14930 A G GATK_Illumina 6.38 17J965(het)82;60;22;VQSRTrancheSNP99.90to100.00|17L166(het)38;23;15;VQSRTrancheSNP99.00to99.90|1H321(het)31;17;14;VQSRTrancheSNP99.00to99.90|1K210(het)52;28;24;VQSRTrancheSNP99
1 14933 14933 G A GATK_Illumina 2.38 17J965(het)88;76;12;VQSRTrancheSNP99.90to100.00|5G540B(het)77;57;20;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_in
1 14948 14948 G A GATK_Illumina 1.38 5G540B(het)75;63;12;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_intronic;downstream WASH7P;DDX11L1 dist=539
1 14976 14976 G A GATK_Illumina 1.38 5G540B(het)62;50;12;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_exonic;downstream WASH7P;DDX11L1 dist=567
1 15903 15903 - C GATK_Illumina 1.38 1K210(hom)2;0;2;VQSRTrancheINDEL99.00to99.90 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_exonic WASH7P ncRNA_ex
1 16495 16495 G C GATK_Illumina 5.38 17L166(het)80;57;23;VQSRTrancheSNP99.90to100.00|1H321(het)48;21;27;VQSRTrancheSNP99.90to100.00|1K210(het)59;38;21;VQSRTrancheSNP99.90to100.00|5G540B(het)95;77;18;VQSRTrancheSNP
1 16497 16497 A G GATK_Illumina 5.38 17J965(het)54;37;17;VQSRTrancheSNP99.90to100.00|17L166(het)74;61;13;VQSRTrancheSNP99.90to100.00|1K210(het)48;39;9;VQSRTrancheSNP99.90to100.00|5G540B(het)86;66;20;VQSRTrancheSNP
1 16534 16534 C T GATK_Illumina 5.38 17J965(het)19;12;7;VQSRTrancheSNP99.90to100.00|17L166(het)10;4;6;VQSRTrancheSNP99.90to100.00|1K210(het)8;4;4;VQSRTrancheSNP99.90to100.00|5G540B(het)14;7;7;VQSRTrancheSNP99.90to
1 16571 16571 G A GATK_Illumina 6.38 17J965(het)55;31;24;VQSRTrancheSNP99.90to100.00|17L166(het)47;16;31;VQSRTrancheSNP99.00to99.90|1H321(het)49;30;19;VQSRTrancheSNP99.90to100.00|1K210(het)52;18;34;VQSRTrancheSNP9
1 16580 16580 C G GATK_Illumina 1.38 6K141(het)43;36;7;VQSRTrancheSNP99.90to100.00 0.125 noSample 0.125 noSample 0.430 noSample ncRNA_intronic;downstream WASH7P;MIR6859-1;MIR6859
这是我原始数据中的一个示例。框架https://www.dropbox.com/s/jfmv6npiiu8n6zv/big_df.txt?dl=0
这将是用户选择17J965
ID时的新data.frame
Chr Start End Ref Alt Callers GATK_Illumina.counts GATK_Illumina.Zygosity GATK_Illumina.Depth GATK_Illumina.RefCount GATK_Illumina.AltCount GATK_Illumina.Filter GATK_SOLiD.counts GATK_SOLiD.Zygosity
1 14653 14653 C T GATK_Illumina 5.38 het 23 19 4 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
1 14907 14907 A G GATK_Illumina 6.38 het 57 40 17 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
1 14930 14930 A G GATK_Illumina 6.38 het 82 60 22 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
1 14933 14933 G A GATK_Illumina 2.38 het 88 76 12 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
1 16497 16497 A G GATK_Illumina 5.38 het 54 37 17 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
1 16534 16534 C T GATK_Illumina 5.38 het 19 12 7 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
1 16571 16571 G A GATK_Illumina 6.38 het 55 31 24 VQSRTrancheSNP99 0.125 - - - - - 0.125 - - - - - 0.430 - -
这是到结果ID数据框https://www.dropbox.com/s/2nfjud7xkb3b6mc/17J965.txt?dl=0
的链接编辑1
我有几个我不知道如何解决的问题:
1)如何识别ID?该ID始终链接到Callers
列,即,如果呼叫者为GATK_Illumina
,则该ID将位于GATK_Illumina.samples
中,如果Callers
列为{{1 }},则ID可以位于两列GATK_Illumina,GATK_SOLID
和GATK_Illumina.samples
中。正如从大data.frame中看到的那样,这变得更加复杂,因为从字母数字ID中有另一个值:样本的格式始终是GATK_SOLID.samples
,然后是alphanumeric code
,{{ 1}},或者bracket
,hom
,然后是het
,然后是another bracket
,然后是3 values separated by a semicolon
(如果该行还有其他ID信息)。例如:character vector
。不同的ID信息用pipe
分隔,格式始终相同。在此示例中,只有一列具有ID信息,因为17J965(het)23;19;4;VQSRTrancheSNP99.90to100.00|17L166(het)10;5;5;VQSRTrancheSNP99.00to99.90|1H321(het)7;4;3;VQSRTrancheSNP99.90to100.00|1K210(het)15;9;6;VQSRTrancheSNP99.00to99
列仅具有值|
,但是如果使用三个不同的调用者值,则会变得很复杂。
2)一旦确定了属于该ID的行,如何将信息放在一起?它只是从大data.frame获取grep,然后是rbind?或基于ID的子集
3)在子ID数据框中,需要根据ID列和Caller
列创建几列,例如:
GATK_Illumina
如果我想为ID Caller
创建新的data.frame,则要创建的新列(如前面的示例所示)将是:
# ID column for row 1 only for value of `Caller` column `GATK_Illumina`:
17J965(het)23;19;4;VQSRTrancheSNP99.90to100.00|17L166(het)10;5;5;VQSRTrancheSNP99.00to99.90|1H321(het)7;4;3;VQSRTrancheSNP99.90to100.00|1K210(het)15;9;6;VQSRTrancheSNP99.00to99
,17J965
,GATK_Illumina.Zygosity
,GATK_Illumina.Depth
,GATK_Illumina.RefCount
,GATK_Illumina.AltCount
,GATK_Illumina.Filter
,GATK_SOLiD.Zygosity
,GATK_SOLiD.Depth
,GATK_SOLiD.RefCount
ID之后的值将填充这些列,如下所示:
GATK_SOLiD.AltCount
请注意,这些列是根据GATK_SOLiD.Filter
列填充的,在此示例中,GATK_Illumina.Zygosity GATK_Illumina.Depth GATK_Illumina.RefCount GATK_Illumina.AltCount GATK_Illumina.Filter GATK_SOLiD.Zygosity GATK_SOLiD.Depth GATK_SOLiD.RefCount GATK_SOLiD.AltCount GATK_SOLiD.Filter
het 23 19 4 VQSRTrancheSNP99 - - - - -
列为Callers
,那么只有 de novo 创建的列将填充Callers
,其余的将使用GATK_Illumina
或GATK_Illumina
值。
到目前为止,我得到的是:
-
如何从列ID中提取所有相关信息
NA
但是,如果我感兴趣的ID在第二个管道上怎么办?
谢谢
答案 0 :(得分:0)
希望您已经找到了解决方案,否则可能会有所帮助。
library(stringr)
library(microbenchmark)
library(tidyr)
library(dplyr)
df <- read.delim("big_df.txt", header=T,sep="\t")
df$GATK_Illumina.samples <- as.character(df$GATK_Illumina.samples)
# Recommend benchmarking to find fast functions for such large dataset
microbenchmark(df[grep("17J965", df$GATK_Illumina.samples),])
microbenchmark(dplyr::filter(df ,grepl("17J965", GATK_Illumina.samples)))
# Subset data
sample <- df[grep("17J965", df$GATK_Illumina.samples),]
# Split the column on "|" and extract the ID needed
sample$umm <- strsplit(sample$GATK_Illumina.samples,"\\|")
sample$umm <- sapply(sample$umm, function(x){x[grep("17J965",x)]})
# Removing brackets and ID to split to makes things easier to split.
# Probably should remove brackets from main df instead for each subset
sample$umm <- sub("17J965|\\(", "",sample$umm)
sample$umm <- sub(")",";",sample$umm)
# Split into columns, filter on the Caller and fill respective columns
sample <- sample %>% dplyr::filter(Callers == "GATK_Illumina") %>% separate(umm,sep=";",into = c("GATK_Illumina.Zygosity", "GATK_Illumina.Depth", "GATK_Illumina.RefCount", "GATK_Illumina.AltCount", "GATK_Illumina.Filter",fill= "left"))
sample <- sample %>% dplyr::filter(Callers == "GATK_SOLiD") %>% separate(umm,sep=";",into = c("GATK_SOLiD.Zygosity", "GATK_SOLiD.Depth", "GATK_SOLiD.RefCount", "GATK_SOLiD.AltCount", "GATK_SOLiD.Filter",fill= "left"))
一些资源: