У меня есть огромный data.frame с ~ 3 миллионами строк и 100 столбцами.В одном из этих столбцов есть информация об идентификаторах.Мне нужно создать скрипт R, который можно использовать для создания нового data.frame на основе этого идентификатора.По сути, этот новый data.frame будет содержать только строки, в которых находится этот идентификатор, а также остальные столбцы из большого data.frame плюс несколько дополнительных столбцов, которые необходимо создать на основе информации, включенной в ID column
.Последняя идея состоит в том, чтобы реализовать это в блестящем приложении, чтобы пользователь мог ввести имя идентификатора, и тогда новый 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
Вот пример из моего исходного data.frame https://www.dropbox.com/s/jfmv6npiiu8n6zv/big_df.txt?dl=0
И это будет новыйdata.frame, когда пользователь выбирает 17J965
ID
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 - -
Вот ссылка на идентификатор кадра данных результата, https://www.dropbox.com/s/2nfjud7xkb3b6mc/17J965.txt?dl=0
РЕДАКТИРОВАТЬ 1
У меня есть несколько проблем, которые я не знаю, как решить:
1) Как идентифицировать личность?Идентификатор всегда связан со столбцом Callers
, т. Е. Если вызывающий абонент GATK_Illumina
, то идентификатор будет в GATK_Illumina.samples
, если в столбце Callers
указан GATK_Illumina,GATK_SOLID
, то идентификатор может быть в двухстолбцы GATK_Illumina.samples
и GATK_SOLID.samples
.Это становится более сложным, как вы можете видеть из большого data.frame, поскольку из буквенно-цифрового идентификатора есть и другие значения: формат для образца всегда одинаков: alphanumeric code
, а затем bracket
, hom
или het
, another bracket
, затем 3 values separated by a semicolon
, character vector
, а затем pipe
, если для этой строки есть другая информация об идентификаторах.Например: 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
.Различная идентификационная информация отделяется |
и формат всегда один и тот же.В этом примере есть только один столбец с информацией ID, поскольку столбец Caller
имеет только значение GATK_Illumina
, но это может осложниться тремя различными значениями вызывающего абонента.
2) После того, как вы определили строки, которыепринадлежат этому идентификатору, как собрать информацию?Это просто получить grep из большого data.frame и затем rbind?или подмножество на основе идентификатора
3) В кадре данных дочернего идентификатора есть несколько столбцов, которые необходимо создать на основе столбца идентификатора и столбца Caller
, например:
# 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
Если я хочу создать новый data.frame для идентификатора 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
, GATK_SOLiD.AltCount
, GATK_SOLiD.Filter
Значения после идентификатора будут заполнять эти столбцы, какthis:
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
, в этом примере столбец Callers
равен GATK_Illumina
, тогда только созданные столбцы de novo с GATK_Illumina
будет заполнено, в остальном должны использоваться значения -
или NA
.
То, что я получил до сих пор:
# Let's suppose that I want the ID: 17J965 and the big data.frame is call `big_df.txt`
big_df <- read.delim("big_df.txt")
sample <- grep("17J965", test2a$GATK_Illumina.samples)
df_sample <- big_df[sample,]
# df_sample has all the rows containing 17J965, but now I want to create the new data.frame with the extra columns and only select the correct values if there are more IDs
Как можноЯ извлекаю всю необходимую информацию из идентификатора столбца
# I know that I can get the ID using this command
samples <- sub("\\(.*", "", b)
Но что, если мой интересующий идентификатор находится на втором канале?
Спасибо