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

如何基于R2相关系数值重新分组SNP数据?

修正后的data.table分组处理方案

核心逻辑梳理

要实现需求,关键要精准区分两种SNP:

  • 需分配新组的SNP:在原分组内,与所有其他SNP的R2均<0.4(且必须存在至少一条与组内SNP的LD记录,无LD记录的情况归为保留原组)
  • 保留原组的SNP:要么和组内至少一个SNP的R2≥0.4,要么没有任何与组内SNP的LD记录

假设数据结构

先定义示例数据方便测试验证:

library(data.table)

# 原遗传变异分组数据
snps <- data.table(
  snp = c("rs1", "rs2", "rs3", "rs4", "rs5", "rs6"),
  group = c(1, 1, 1, 2, 2, 3)  # rs6是组3唯一SNP,无LD记录
)

# 变异间R2相关系数数据(单向存储)
ld <- data.table(
  snp1 = c("rs1", "rs1", "rs2", "rs3", "rs4"),
  snp2 = c("rs2", "rs3", "rs3", "rs1", "rs5"),
  r2 = c(0.5, 0.3, 0.6, 0.3, 0.2)
)

修正后的代码实现

# 1. 处理LD数据:将单向SNP对转为双向,确保每个SNP的组内关联都能被匹配到
ld_both <- rbind(ld, ld[, .(snp1 = snp2, snp2 = snp1, r2)])

# 2. 关联原分组数据,匹配每个SNP对应的组内其他SNP的R2值
snps_ld <- snps[ld_both, on = .(snp = snp1), 
                .(snp = snp1, group, partner_snp = snp2, r2)]

# 3. 按SNP+原分组聚合,判断是否符合新组条件并生成结果
snps_result <- snps[, {
  # 获取当前SNP在原分组内的所有R2值
  snp_r2 <- snps_ld[snp == .BY$snp & group == .BY$group, r2]
  
  # 核心条件:存在LD记录 且 所有R2均小于0.4
  need_new_group <- length(snp_r2) > 0 & all(snp_r2 < 0.4)
  
  # 生成新分组:符合条件则用原组号加后缀标识,否则保留原组
  new_group <- if (need_new_group) paste0(group, "_new") else as.character(group)
  
  .(new_group = new_group)
}, by = .(snp, group)]

结果说明

运行代码后,snps_result的输出完全符合需求:

  • rs1:与rs2的R2=0.5≥0.4 → 保留组1
  • rs2:与rs1、rs3的R2均≥0.4 → 保留组1
  • rs3:与rs2的R2=0.6≥0.4 → 保留组1
  • rs4:与rs5的R2=0.2<0.4(组内唯一LD记录)→ 分配新组2_new
  • rs5:与rs4的R2=0.2<0.4(组内唯一LD记录)→ 分配新组2_new
  • rs6:无任何LD记录 → 保留组3

内容的提问来源于stack exchange,提问作者DN1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:33:11