基于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组同时满足两个条件,所有行均被保留
- AD组两行
可选:添加中间标记(方便调试)
如果需要查看分组的判断过程,可以先给每个组添加标记列,再筛选:
# 添加分组判断标记 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
相关产品推荐
相关产品推荐

