问题描述
我正在处理一个包含遗传变异信息的 tsv 文件。鉴于此信息来自多个数据库,我的文件包含重复数据。在我的例子中,数据库是“dbSNP”,它包含各种变异(良性和致病变异,名称以“rs”开头)和“HGMD-PUBLIC”(在我的例子中只包含致病变异,名称以“rs”开头)用“CM”)。
以下是一些示例数据:
variant_name <- c("rs1320425680","rs1217211965","rs1257939387","rs74315401","CM890102")
variant_source <- c("dbSNP","dbSNP","HGMD_PUBLIC")
chromosome <- c(20,20,20)
position_start <- c(4699513,4699516,4699520,4699525,4699525)
position_end <- c(4699513,4699525)
ancestral_allele <- c("A","G","C","C")
clinical_significance <- c(NA,NA,"pathogenic",NA)
variant_alleles <- c("A/C","G/A/T","C/G","C/T","HGMD_MUTATION")
example <- tibble(variant_name,variant_source,chromosome,position_start,position_end,ancestral_allele,clinical_significance,variant_alleles)
这里,第 4 行和第 5 行实际上是来自两个不同数据库的相同变体的副本。知道变体出现在两者中对我来说很重要。
我想要做的是将数据扩展为“宽”格式,包含两个新列:dbSNP
和 HGMD_PUBLIC
(目前位于 variant_source
中)。这些列将包含最初在 variant_name
列中找到的条目,如下所示:
dbSNP <- c("rs1320425680","rs74315401")
HGMD_PUBLIC <- c(NA,"CM890102")
chromosome <- c(20,"pathogenic")
variant_alleles <- c("A/C","C/T")
result <- tibble(dbSNP,HGMD_PUBLIC,variant_alleles)
如您所见,第 5 行不再存在,但 variant_name
已移至 dbSNP
或 HGMD_PUBLIC
列。
也许上面的功能可以通过 spread
函数来实现,使重新排列以名称为条件,但我不知道该怎么做。
解决方法
这是一个使用 data.table
+ dcase
fcoalesce
选项
dcast(
setDT(example),... ~ variant_source,value.var = "variant_name"
)[,lapply(.SD,function(x) fcoalesce(as.list(x))),by = chromosome:ancestral_allele
]
给出
chromosome position_start position_end ancestral_allele
1: 20 4699513 4699513 A
2: 20 4699516 4699516 G
3: 20 4699520 4699520 C
4: 20 4699525 4699525 C
clinical_significance variant_alleles HGMD_PUBLIC dbSNP
1: <NA> A/C <NA> rs1320425680
2: <NA> G/A/T <NA> rs1217211965
3: <NA> C/G <NA> rs1257939387
4: pathogenic HGMD_MUTATION CM890102 rs74315401