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

如何解码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:10:55