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

基于gene分组筛选s2/s3列含交替Het值的R数据行

解决方案:按Gene分组筛选交替Het的组

我们可以用dplyr包通过分组判断的方式实现需求,核心是检查每个基因组内是否同时存在两种关键行:一行s2=Het且s3为Ref/No_GT,另一行s2=Ref/No_GT且s3=Het。

步骤1:准备数据(替换为你的真实数据集即可)

library(dplyr)

# 模拟符合需求的示例数据集
df <- tibble(
  gene = c(rep("AA", 2), rep("AB", 3), rep("AZ", 2), rep("AD", 2), rep("BC", 2)),
  s2 = c("Het", "Ref", "Het", "No_GT", "Het", "No_GT", "Het", "Het", "Het", "Het", "Ref"),
  s3 = c("Ref", "Het", "Ref", "Het", "No_GT", "Het", "Ref", "Het", "Het", "Ref", "Ref")
)

步骤2:分组筛选符合条件的组

直接通过group_by() + filter()实现,用any()函数检查组内是否存在目标行:

# 筛选并保留符合交替Het条件的基因组所有行
final_result <- df %>%
  group_by(gene) %>%
  filter(
    # 条件1:组内存在s2=Het且s3为Ref/No_GT的行
    any(s2 == "Het" & s3 %in% c("Ref", "No_GT")) &
    # 条件2:组内存在s2为Ref/No_GT且s3=Het的行
    any(s2 %in% c("Ref", "No_GT") & s3 == "Het")
  ) %>%
  ungroup()

# 查看最终结果
final_result

代码逻辑说明

  • group_by(gene):按基因字段分组处理
  • any()函数用于检查组内是否存在满足指定条件的行,只要有一行符合就返回TRUE
  • 两个条件同时满足时,整个组的所有行都会被保留:
    • AD组两行s2和s3均为Het,不满足任一条件,被剔除
    • BC组仅存在s2=Het的行,无s3=Het且s2为Ref/No_GT的行,不满足第二个条件,被剔除
    • AA、AB、AZ组同时满足两个条件,所有行均被保留

可选:添加中间标记(方便调试)

如果需要查看分组的判断过程,可以先给每个组添加标记列,再筛选:

# 添加分组判断标记
df_marked <- df %>%
  group_by(gene) %>%
  mutate(
    has_het_s2 = any(s2 == "Het" & s3 %in% c("Ref", "No_GT")),
    has_het_s3 = any(s2 %in% c("Ref", "No_GT") & s3 == "Het"),
    keep_group = has_het_s2 & has_het_s3
  ) %>%
  ungroup()

# 筛选保留目标组
final_result <- df_marked %>% filter(keep_group) %>% select(-has_het_s2, -has_het_s3, -keep_group)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:25:16