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

修复data.table中按家族条件筛选行的pedFam函数问题

修复data.table谱系筛选函数pedFam的方案

排查与修复步骤:

  • 检查家族标识的有效性
    先确认full_ped2的家族ID列(如fam_id)无空值、无零个体家族:

    # 统计空家族ID的个体数
    full_ped2[is.na(fam_id), .N]
    # 列出个体数为0的家族(如果有)
    full_ped2[, .N, by = fam_id][N == 0]
    

    若存在异常,先清理数据:

    full_ped2 <- full_ped2[!is.na(fam_id)]
    full_ped2 <- full_ped2[fam_id %in% full_ped2[, .(N = .N), by = fam_id][N >= 1]$fam_id]
    
  • 重构亲本追踪的递归逻辑
    多数失效场景源于未递归覆盖所有亲本,或终止条件错误。重新实现核心逻辑:

    pedFam <- function(full_ped) {
      ped <- copy(full_ped)
      # 标记每个家族至少1个初始个体(这里取每个家族首行)
      ped[, keep := FALSE]
      ped[, keep[1] := TRUE, by = fam_id]
      
      # 递归追踪所有关联亲本
      repeat {
        # 提取当前已保留个体的亲本ID,排除空值
        current_parents <- unique(c(ped[keep, father_id], ped[keep, mother_id]))
        current_parents <- current_parents[!is.na(current_parents)]
        # 找到未被标记的亲本
        new_keep <- ped[id %in% current_parents & !keep, id]
        if (length(new_keep) == 0) break
        # 更新标记
        ped[id %in% new_keep, keep := TRUE]
      }
      
      return(ped[keep])
    }
    
  • 优化data.table的匹配效率
    为id列设置键,避免匹配时的性能问题或逻辑错误:

    setkey(full_ped2, id)
    # 也可以在函数内部设置键,保证通用性
    pedFam <- function(full_ped) {
      ped <- copy(full_ped)
      setkey(ped, id)
      # 后续筛选逻辑...
    }
    
  • 验证边界场景
    针对full_ped2的特殊情况单独排查:

    # 检查是否有亲本ID不在数据集内
    missing_parents <- setdiff(unique(c(full_ped2$father_id, full_ped2$mother_id)), full_ped2$id)
    missing_parents <- missing_parents[!is.na(missing_parents)]
    if (length(missing_parents) > 0) {
      warning(paste("未找到的亲本ID:", paste(missing_parents, collapse = ", ")))
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:32:53