You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建PLINK的.ped文件:如何拆分SNP列单元格值生成双等位基因列

解决方案

R实现(推荐处理宽表场景)

使用高效的data.table包处理17万列的宽表,性能远优于base R和tidyverse系列工具:

  1. 安装加载依赖包
install.packages("data.table")
library(data.table)
  1. 读取并处理数据
# 读取已移除表头的输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:06:08