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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:09:58