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

R语言删除id列重复时group值为998的数据行

问题分析

你需要实现的筛选规则非常明确:仅删除 id列重复、且group列取值为998 的行,id唯一的行无论group是否为998都保留。
你给出的示例数据集结构如下:

id group
1  1   5
2  1 998
3  2   2
4  2   3
5  3 998

按照规则,该示例数据中仅第2行需要被删除,id为3、group为998的第5行需要保留。
之前编写的代码报错核心原因有两个:

  • R内置的unique()函数不存在by参数,你混淆了不同去重函数的参数规则,传入不存在的参数会直接触发执行错误
  • subset()要求传入的判断条件是和数据框行数等长的逻辑向量,你写的unique(by = "id")无法生成逐行判断的逻辑值,自然无法正常运行。
    你之前运行代码得到的报错信息如下:

Error in is.factor(x) : Argument "x" is missing, with no default

可行代码方案

dplyr 管道符写法(适配你之前的编码习惯)

直接按id分组统计每组行数,再按规则筛选即可,不需要生成冗余临时列:

library(dplyr)
df1 <- df %>%
  group_by(id) %>%
  filter(!(n() > 1 & group == 998)) %>%
  ungroup()

如果不习惯分组筛选,也可以先给每个id加计数列再筛选,逻辑更直观:

df1 <- df %>%
  add_count(id, name = "id_occur_times") %>%
  filter(!(id_occur_times > 1 & group == 998)) %>%
  select(-id_occur_times)

以上两种写法跑示例数据的输出结果完全一致:

id group
1  1     5
2  2     2
3  2     3
4  3   998

完全匹配预期。

base R 写法(无需加载第三方包)

如果不想加载dplyr,可以用R内置的ave()函数分组计数后筛选:

# 按id分组统计每个id的出现次数
id_count <- ave(rep(1, nrow(df)), df$id, FUN = length)
# 按规则过滤行
df1 <- df[!(id_count > 1 & df$group == 998), ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:36:20