R语言如何按规则去除dataframe中计算机测试记录的重复值
最简实现方案
直接用tidyverse的分组操作就能实现,不需要写冗长的逐行if/else判断,也没必要硬套unique()方法,代码逻辑非常简洁,且能完全覆盖你说的三类数据场景。
核心思路
按计算机标识Computer分组后,只需要做两步判断即可:
- 所有
Working?值为1的记录,无论对应设备是全正常还是混有异常记录,一律保留 - 对于
Working?值为0的记录,仅当对应设备所有测试结果全为0、且是该设备的第一条0记录时才保留,其余0记录全部删除
可直接运行的代码
library(tidyverse) cleaned_result <- WorkingComputerDf %>% group_by(Computer) %>% mutate( # 标记当前设备是否存在正常工作的测试记录 exist_normal = any(`Working?` == 1), # 给组内每条记录编行号 row_id = row_number() ) %>% filter( `Working?` == 1 | (!exist_normal & row_id == 1) ) %>% # 移除临时生成的辅助列 select(-exist_normal, -row_id) %>% ungroup()
不同方案的适配性说明
- 关于
unique()方法:unique()仅支持整行去重,没法区分「混有0/1的设备要删除全部0记录」和「全0设备要保留1条0记录」的规则差异,硬用的话反而需要额外写大量分支判断,得不偿失。 - 关于纯if/else条件判断:当然可以实现,但需要写循环逐设备遍历判断,代码冗余度高,后续如果调整清洗规则改起来很麻烦,远不如分组操作的逻辑直观。
- 上述tidyverse方案可以自动适配你提到的三类场景:
- 多次测试全为1的设备:所有记录的
Working?都是1,会被全部保留 - 同时存在0和1测试结果的设备:
exist_normal标记为TRUE,所有Working?为0的记录会被自动过滤,仅保留正常记录 - 多次测试全为0的设备:
exist_normal标记为FALSE,仅保留第一条0记录,其余重复0记录会被删除
- 多次测试全为1的设备:所有记录的
内容的提问来源于stack exchange,提问作者Talia Wadermann
相关产品推荐
相关产品推荐

