如何在R语言中识别并移除反转重复且PropIBD为0的行?
在R中移除反转重复且PropIBD为0的行
首先还原你的示例数据框:
df <- data.frame( FID1 = c("ABC", "DEF", "GHI", "LMO", "L454"), FID2 = c("DEF", "ABC", "LMO", "GHI", "9G09"), PropIBD = c(0.5, 0, 0.002, 0, 0), stringsAsFactors = FALSE )
方法一:使用dplyr包(直观易读)
通过生成标准化配对键来识别反转重复组,再按组筛选目标行:
library(dplyr) result_df <- df %>% # 生成标准化键:将每行的FID1/FID2排序后拼接,反转配对会得到相同键 mutate(pair_key = pmap_chr(list(FID1, FID2), ~paste(sort(c(..1, ..2)), collapse = "-"))) %>% group_by(pair_key) %>% # 筛选规则:组内多行则保留PropIBD不为0的行;单行直接保留 filter(n() == 1 | PropIBD != 0) %>% select(-pair_key) %>% ungroup() print(result_df)
方法二:使用base R(无需额外包)
通过分组遍历实现相同逻辑:
# 生成标准化配对键 df$pair_key <- apply(df[, c("FID1", "FID2")], 1, function(x) paste(sort(x), collapse = "-")) # 按键分组处理 result_df <- do.call(rbind, lapply(split(df, df$pair_key), function(g) { if(nrow(g) > 1) { g[g$PropIBD != 0, ] } else { g } })) # 清理辅助列并重置行名 result_df <- result_df[, !names(result_df) %in% "pair_key"] rownames(result_df) <- NULL print(result_df)
两种方法运行后都会得到目标结果:
FID1 FID2 PropIBD 1 ABC DEF 0.500 2 GHI LMO 0.002 3 L454 9G09 0.000
内容的提问来源于stack exchange,提问作者Khaleesi95
相关产品推荐
相关产品推荐

