如何基于pos列分组处理行互补对并填充遗传数据缺失值?
遗传数据集缺失值填充方案(基于DNA互补规则)
需求说明
给定含重复基因组位置(pos列)的遗传数据集,需按pos分组完成以下操作:
- 用组内非缺失单元格(非
NN)填充缺失单元格 - 若同组内两行的
alleles不同,填充时需遵循DNA互补规则:- TT ↔ AA
- GG ↔ CC
原始数据集
df <- data.frame( chr = c(1, 1, 2, 2), alleles = c("G/A", "C/T", "T/C", "T/C"), pos = c(13276, 13276, 56329, 56329), B_005 = c("GG", "CC", "TT", "NN"), B_087 = c("AA", "TT", "TT", "TT"), B_013 = c("GA", "NN", "TT", "TT"), B_140 = c("NN", "CC", "NN", "CC") )
期望填充结果
df_filled <- data.frame( chr = c(1, 1, 2, 2), alleles = c("G/A", "C/T", "T/C", "T/C"), pos = c(13276, 13276, 56329, 56329), B_005 = c("GG", "CC", "TT", "TT"), B_087 = c("AA", "TT", "TT", "TT"), B_013 = c("GA", "CT", "TT", "TT"), B_140 = c("GG", "CC", "CC", "CC") )
解决方案(R语言)
使用tidyverse工具链实现分组填充,核心逻辑是判断组内alleles是否为互补对,再决定填充方式:
library(tidyverse) # 定义DNA单个碱基的互补映射表 complement_map <- c("A" = "T", "T" = "A", "G" = "C", "C" = "G") # 自定义缺失值填充函数 fill_missing_vals <- function(col, alleles_in_group) { # 提取组内非缺失值 non_missing <- col[col != "NN"] if (length(non_missing) == 0) return(col) # 拆分alleles为单个碱基,判断组内是否为互补allele对 allele_split <- str_split(alleles_in_group, "/", simplify = TRUE) is_complementary_pair <- all( complement_map[allele_split[1,]] == allele_split[2,] ) # 逐个处理单元格 map_chr(col, function(cell) { if (cell != "NN") return(cell) if (is_complementary_pair) { # 对非缺失值的每个碱基取互补后拼接 str_split(non_missing, "")[[1]] %>% map_chr(~complement_map[.x]) %>% paste(collapse = "") } else { # 直接复用非缺失值 non_missing } }) } # 按pos分组,对所有样本列应用填充逻辑 df_filled <- df %>% group_by(pos) %>% mutate(across(starts_with("B_"), ~fill_missing_vals(.x, alleles))) %>% ungroup() # 查看填充结果 print(df_filled)
代码说明
- 互补映射表:定义单个碱基的互补关系,为序列转换提供基础
- 填充函数:
- 先筛选组内非缺失值,若全缺失则直接返回原列
- 拆分组内的
alleles,判断是否为互补碱基对 - 对缺失值(
NN),根据是否为互补对选择直接复用非缺失值,或转换为互补序列后填充
- 分组处理:按
pos分组,对所有样本列(B_开头)应用填充函数,最终得到目标数据集
内容的提问来源于stack exchange,提问作者SAL
相关产品推荐
相关产品推荐

