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
相关产品推荐
相关产品推荐

