有时候,我们会遇到Excel格式的基因型数据,这篇博文介绍一下如何手动转为plink格式。
可以在Excel中整理,也可以在R语言中整理。数据量少的话,就在Excel中整理,数据量大的话,就在R语言中整理就行。
主要思路是根据plink的格式特点,针对性的满足,然后导出,就可以了。
第一列是snpID,第二列是染色体,第三列是物理位置,第四列是参考基因组分型,第五列以后是每个样本的具体分型。
整体而言,每一行是一个snp,第五列以后每一列是一个样本。
「.map格式」
格式说明链接: http://zzz.bwh.harvard.edu/plink/data.shtml#map
❝map格式的文件, 主要是图谱文件信息, 主要包括染色体名称, 所在的染色体和所在染色体的坐标.❞
1, map文件没有行头
2, map文件包括四列: 染色体, SNP名称, SNP位置, 碱基对坐标
3, 如果只有SNP名称, 可以手动构建map文件, 第二列为SNP名称, 其它三列为0即可.
Example:
1 snp1 0 1
1 snp2 0 2
1 snp3 0 3
「.ped格式」格式说明链接:http://zzz.bwh.harvard.edu/plink/data.shtml#ped
❝bed格式的文件, 主要包括SNP的信息, 包括个体ID, 系谱信息, 表型和SNP的分型信息.❞
1, 数据没有行头, 空格或者tab隔开的文件 2, 必须要有六列, 包括系谱信息, 表型信息
3, 上面六列, 必须要有, 如果没有相关数据, 用0表示.
所以,下面的任务就是把Excel的格式,变为plink的ped和map格式。
library(openxlsx)
library(tidyverse)
dat = read.xlsx("SNP-excel.xlsx")
dat[1:10,1:10]
map = dat %>% select(2,1,x = 3,p = 3)
head(map)
下面这个代码复杂一点,主要的逻辑:
ped = dat %>% select(-c(1:4)) %>% t() %>% as.data.frame() %>%
mutate(ID = rownames(ped)) %>%
mutate(x3=0,x4=0,x5=0,x6=0) %>%
select(FID=ID,IID=ID,x3,x4,x5,x6,everything())
ped[1:10,1:10]
这里有个坑:默认plink的缺失为0,如果AT连写的格式,是00,但是如果一列都是00的时候,就变为了一个0,就会map和ped不匹配。
比较靠谱的方式是,将缺失变为##,然后将其变为00.
library(data.table)
fwrite(map, "file.map",col.names = F,quote = F,sep = " ")
fwrite(ped, "file.ped",col.names = F,quote = F,sep = " ",na = "##")
sed -i 's/##/00/g' file.ped
plink --file file --missing
搞定!
大家好,我是邓飞,一个持续分享的农业数据分析师