如何解码R数据框中的SNP编码列
解码SNP数字编码为基因型的R实现方案
现有两个R数据框:
gt:包含多列SNP数据,每列的值以1、2、3编码(示例仅展示2列)gt_codes:存储每个SNP的编码与对应基因型的映射关系
需求是根据gt_codes的映射规则,将gt中的数字编码替换为对应的基因型,生成目标数据框。
示例数据
# gt数据框 structure(list(rs2278426..DOCK6. = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L), rs1122326..HSPB9. = c(2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L)), row.names = c(NA, 10L), class = "data.frame") # gt_codes映射数据框 structure(list(rs_id = c("rs2278426..DOCK6.", "rs2278426..DOCK6.", "rs2278426..DOCK6.", "rs1122326..HSPB9.", "rs1122326..HSPB9.", "rs1122326..HSPB9."), code = c(1, 2, 3, 1, 2, 3), gt = c("AA", "AT", "TT", "AA", "AT", "TT")), class = "data.frame", row.names = c(NA, -6L))
方法1:基础R实现
先将gt_codes转换为按SNP分组的映射列表,再遍历gt的每一列完成值替换:
# 将gt_codes转换为嵌套映射列表:外层键为SNP名称,内层键为编码 code_map <- split(gt_codes$gt, list(gt_codes$rs_id, gt_codes$code)) code_map <- lapply(split(code_map, gsub("\\.\\d+$", "", names(code_map))), function(x) setNames(x, gsub("^.*\\.", "", names(x)))) # 遍历gt的每一列,替换编码为对应基因型 gt_decoded <- data.frame(lapply(names(gt), function(col) { map <- code_map[[col]] unname(map[as.character(gt[[col]])]) }), stringsAsFactors = FALSE) names(gt_decoded) <- names(gt)
方法2:tidyverse实现(更适合多列场景)
通过长格式转换+关联匹配+宽格式还原的流程,高效处理多列SNP数据:
library(tidyverse) gt_decoded <- gt %>% mutate(row_id = row_number()) %>% # 添加行号用于恢复原结构 pivot_longer(-row_id, names_to = "rs_id", values_to = "code") %>% # 转成长格式 left_join(gt_codes, by = c("rs_id", "code")) %>% # 匹配基因型 pivot_wider(id_cols = row_id, names_from = rs_id, values_from = gt) %>% # 转回宽格式 select(-row_id) # 移除辅助行号列
两种方法最终都会生成解码后的数据集,数字编码将被替换为对应的基因型(例如rs2278426..DOCK6.列的1替换为AA,2替换为AT)。
内容的提问来源于stack exchange,提问作者arshad
相关产品推荐
相关产品推荐

