R 用VCF文件中的DNA字母替换数字基因型代码
这里我有一个修改过的VCF文件,其中每个序列行的基因型都用数字表示,相应的SNP字母在SNP列的列表中(我通过聚合Ref和Alt列生成了该列) 使用dplyr,我想用SNP字母替换数值。所有位置都是纯合的,SNP列表按照数字基因型的顺序排列,因此使用数字基因型的第一个数字(加1)应该给出相应SNP字母的列表索引。像这样:R 用VCF文件中的DNA字母替换数字基因型代码,r,dplyr,R,Dplyr,这里我有一个修改过的VCF文件,其中每个序列行的基因型都用数字表示,相应的SNP字母在SNP列的列表中(我通过聚合Ref和Alt列生成了该列) 使用dplyr,我想用SNP字母替换数值。所有位置都是纯合的,SNP列表按照数字基因型的顺序排列,因此使用数字基因型的第一个数字(加1)应该给出相应SNP字母的列表索引。像这样: Ref 1st Alt 2nd Alt 3rd Alt SNP letter: C A T
Ref 1st Alt 2nd Alt 3rd Alt
SNP letter: C A T G
Numeric genotype: 0 1 2 3
List index: 1 2 3 4
修改的VCF数据帧:
CHR POS SNP Line1 Line2 Line3
01 10 c("A", "G") 0|0 1|1 0|0
01 20 c("C", "T", "A") 2|2 0|0 1|1
02 15 c("G", "T") 1|1 0|0 1|1
期望输出:
CHR POS SNP Line1 Line2 Line3
01 10 c("A", "G") A G A
01 20 c("C", "T", "A") A C T
02 15 c("G", "T") T G T
到目前为止,我已经尝试过这样的方法:
VCF %>%
rowwise() %>%
mutate_at(vars(4:ncol(.)), funs(str_replace(., "^(\\d)|\\d", SNP[[1]]["\\1"+1])))
但都没有成功
提前感谢您的帮助
结构是:
VCF <- structure(list(CHR = c("01", "01", "01"), POS = c(29463,
29517, 29522), SNP = list(c("T", "C"), c("C", "G", "A"), c("T",
"C")), PI548298 = c("0|0", "0|0", "1|1"), PI548488 = c("0|0", "0|0",
"0|0"), PI548348 = c("0|0", "0|0", "1|1")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -3L))
VCF我们可以通过使用substr
来获得每个PI
列的第一个字符(因为这就是我们需要的所有信息),将其转换为数字,添加1(因为R索引从1开始),然后使用它来子集SNP
列
通过使用行方式
,我们将此函数分别应用于每一行,并利用该行的SNP向量:
library(tidyverse)
VCF %>%
rowwise() %>%
mutate_at(vars(starts_with('PI')),
list(~ SNP[as.numeric(substr(., 0, 1)) + 1]))
Source: local data frame [3 x 6]
Groups: <by row>
# A tibble: 3 x 6
CHR POS SNP PI548298 PI548488 PI548348
<chr> <dbl> <list> <chr> <chr> <chr>
1 01 29463 <chr [2]> T T T
2 01 29517 <chr [3]> C C C
3 01 29522 <chr [2]> C T C
库(tidyverse)
VCF%>%
行()
在(vars)(以('PI')开头)处变异,
列表(~SNP[as.numeric(substr(,0,1))+1]))
来源:本地数据帧[3 x 6]
组:
#一个tibble:3x6
CHR POS SNP PI548298 PI548488 PI548348
10129463吨
20129517摄氏度
30129522摄氏度
1)您能否使用dput
发布您的数据,以便我们可以使用您实际拥有的数据?例如,SNP真的是包含R表达式的字符串,而不是实际的向量或列表吗?2) 在3行列中,是否存在杂合SNPs?我们可以忽略每个“行”列中的第二个数字吗?如果没有,您希望如何处理该问题?编辑为包含dput。是的,所有的位置都是纯合的,所以第二个数字可以忽略。这太完美了。谢谢你@divibisan。