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

如何在R中保留多重复ID的第一组重复项并解决代码报错?

解决重复Sample.ID保留前两条记录的问题

问题背景

数据框clin.info的Sample.ID列存在重复值,部分ID出现次数超过2次,需要仅对这些重复次数>2的ID保留前两条记录,其余仅重复2次的ID保持原样。

当前代码与报错

代码

n_occur <- data.frame(table(clin.info$Sample.ID))
multiple.duplicates <- n_occur[n_occur$Freq > 2,]

if(multiple.duplicates$Var1 %in% clin.info$Sample.ID){
  clin.info <- clin.info %>% 
    group_by(Sample.ID) %>% 
    distinct
}

报错信息

Error in if (multiple.duplicates$Var1 %in% clin.info$Sample.ID) { : 
  argument is of length zero

数据详情

clin.info结构:

> dput(clin.info)
structure(list(Sample.ID = c("TCGA.B2.3924.01", "TCGA.B2.3924.01", 
"TCGA.B2.3924.01", "TCGA.B2.3924.01", "TCGA.B2.5635.01", "TCGA.B2.5635.01", 
"TCGA.B2.5635.01", "TCGA.B2.5635.01", "TCGA.B2.5635.01", "TCGA.B2.5635.01", 
"TCGA.A3.3357.01", "TCGA.A3.3357.01", "TCGA.A3.3367.01", "TCGA.A3.3367.01", 
"TCGA.A3.3387.01", "TCGA.A3.3387.01", "TCGA.B0.4698.01", "TCGA.B0.4698.01", 
"TCGA.B0.4710.01", "TCGA.B0.4710.01"), age = c("73", "73", "73", 
"73", "74", "74", "74", "74", "74", "74", "62", "62", "72", "72", 
"49", "49", "75", "75", "75", "75")), row.names = c(67L, 68L, 
69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L), class = "data.frame")

multiple.duplicates结构:

> dput(multiple.duplicates)
structure(list(Var1 = structure(6:7, levels = c("TCGA.A3.3357.01", 
"TCGA.A3.3367.01", "TCGA.A3.3387.01", "TCGA.B0.4698.01", "TCGA.B0.4710.01", 
"TCGA.B2.3924.01", "TCGA.B2.5635.01"), class = "factor"), Freq = c(4L, 
6L)), row.names = 6:7, class = "data.frame")

预期输出

仅对multiple.duplicates中的两个ID(TCGA.B2.3924.01、TCGA.B2.5635.01)保留前两条记录,其余ID保持原有2条记录不变。


报错原因

  1. if语句要求判断条件是长度为1的逻辑值,但multiple.duplicates$Var1 %in% clin.info$Sample.ID返回的是长度为2的逻辑向量(对应两个重复次数超标的ID),不符合if的语法要求,触发报错。
  2. 原代码中的distinct()会直接去重每组所有重复项,只保留1条记录,与需求中保留前两条的要求不符。

解决方案

方法1:精准筛选(针对重复次数超标的ID处理)

使用dplyr添加组内行号,再根据条件筛选:

library(dplyr)

clin.info <- clin.info %>%
  group_by(Sample.ID) %>%
  # 为每个组的记录添加行号
  mutate(group_row = row_number()) %>%
  ungroup() %>%
  # 筛选规则:要么是重复次数未超标的ID全部保留,要么是超标ID保留前2行
  filter(!Sample.ID %in% multiple.duplicates$Var1 | group_row <= 2) %>%
  # 移除临时行号列
  select(-group_row)

方法2:简化版(通用处理)

如果所有ID的重复次数都≥2,直接对每个组保留前2行即可,重复次数为2的组不受影响:

library(dplyr)

clin.info <- clin.info %>%
  group_by(Sample.ID) %>%
  slice(1:2) %>%
  ungroup()

结果验证

运行后,TCGA.B2.3924.01和TCGA.B2.5635.01各保留2条记录,其余ID也维持2条记录,完全符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:34:55