创建PLINK的.ped文件:如何拆分SNP列单元格值生成双等位基因列
解决方案
R实现(推荐处理宽表场景)
使用高效的data.table包处理17万列的宽表,性能远优于base R和tidyverse系列工具:
- 安装加载依赖包
install.packages("data.table") library(data.table)
- 读取并处理数据
# 读取已移除表头的输入csv,第一列为样本ID dt <- fread("你的输入文件路径.csv", header = FALSE) samples <- dt[[1]] geno_cols <- dt[, -1] # 定义基因型拆分函数,兼容/、|两种分隔符,自动处理缺失值和空值 split_geno <- function(x) { if (x == "" || is.na(x)) return(c("", "")) if (x == "-9") return(c("-9", "-9")) unlist(strsplit(x, "[/|]")) } # 批量拆分所有基因型列 processed <- lapply(geno_cols, function(col) { t(sapply(col, split_geno)) }) # 合并结果并重命名列 processed_dt <- do.call(cbind, processed) # 如果保留原始SNP名称,可将original_snp_names替换为你原始的SNP列名向量 snps <- paste0(rep(paste0("SNP",1:ncol(geno_cols)), each=2), "_All", 1:2) colnames(processed_dt) <- snps # 加回样本列并输出 final_dt <- cbind(data.table(Sample = samples), processed_dt) fwrite(final_dt, "输出文件路径.csv", sep = "\t", quote = FALSE)
Unix实现(适合大文件流式处理)
用awk直接流式处理文件,无需加载全部数据到内存,适合超大规模文件:
# 逗号分隔csv适配代码,制表符分隔请将-F ','和OFS=","改为-F '\t'和OFS="\t" awk -F ',' 'BEGIN{OFS=","} { printf "%s", $1; for(i=2; i<=NF; i++) { if ($i == "" || $i == "-9") { printf ",%s,%s", $i, $i; } else { split($i, arr, /[\/|]/); printf ",%s,%s", arr[1], arr[2]; } } printf "\n"; }' 输入文件.csv > 输出文件.csv
注意事项
- 若需要生成标准PLINK .ped文件,需要在输出结果最左侧补全6列必填信息:家系ID、个体ID、父本ID、母本ID、性别、表型,其中个体ID需和当前Sample列完全对应。
- PLINK默认的缺失基因型编码为0,可按需将代码中返回的
-9替换为0即可直接适配PLINK格式要求。
内容的提问来源于stack exchange,提问作者Francesca Minnai
相关产品推荐
相关产品推荐

