最近,星球内有位老师问了一个问题,之前我写了一篇博客(Excel格式的SNP数据怎么变为plink格式),老师说他的数据和我的一样,却报错了:

世界上有很多报错,我不为之操心,但是我的代码报错了,我就要负责到底。于是我问老师要来示例数据,测试了一下。示例数据是这样的:

我把它放到了D盘,然后运行我的代码: setwd("D:/") library(openxlsx) library(tidyverse) library(data.table)
dat = read.xlsx("SNP.xlsx") dat
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]
报错了: 
好吧,我的代码真的有问题,于是我开始查找问题,发现代码是到这一步报错的: dat %>% select(-c(1:4)) %>% t() %>% as.data.frame() %>% mutate(ID = rownames(ped)) 
很明显,是因为没有ped这个对象。所以,代码有错误,不要用ped,要用点号.来表示数据的对象传参。 所以完整的代码是:
setwd("D:/") library(openxlsx) library(tidyverse) library(data.table)
dat = read.xlsx("SNP.xlsx") dat
map = dat %>% select(2,1,x = 3,p = 3) head(map)
ped = dat %>% select(-c(1:4)) %>% t() %>% as.data.frame() %>% mutate(ID = rownames(.)) %>% mutate(x3=0,x4=0,x5=0,x6=0) %>% select(FID=ID,IID=ID,x3,x4,x5,x6,everything()) ped[1:10,1:10] fwrite(map, "file.map",col.names = F,quote = F,sep = " ") fwrite(ped, "file.ped",col.names = F,quote = F,sep = " ",na = "##")
然后结果我保存为file的plink文件,注意,这里的缺失值是##,所以我们需要替换为00,在git终端下运行sed命令: sed -i 's/##/00/g' file.ped 查看plink的ped文件和map文件:(注意,我这里用cat是因为数据少,多的话,用less -S)


用plink命令测试一下,文件是否正确: plink --file file --missing
结果没问题: 
|