基于附加条件移除重复行:仅删除含NA的同id重复行
解决方案
使用dplyr包处理
library(dplyr) myoutput <- myinput %>% group_by(id) %>% mutate( has_na = rowSums(is.na(.)) > 0, has_complete = any(!has_na) ) %>% filter(!has_complete | !has_na) %>% select(-has_na, -has_complete) %>% ungroup() # 查看结果 myoutput
使用Base R处理
# 标记每行是否含NA has_na <- rowSums(is.na(myinput)) > 0 # 标记每个id组是否存在无NA的完整行 has_complete <- ave(!has_na, myinput$id, FUN = any) # 筛选符合要求的行 myoutput <- myinput[!has_complete | !has_na, ] # 查看结果 myoutput
逻辑说明
- 标记行与组状态:先识别每行是否包含NA,再判断每个
id分组内是否存在无NA的完整行。 - 筛选规则:
- 若分组内没有完整行(如
id=3),保留所有行; - 若分组内有完整行,仅保留无NA的行(自动删除同组内含NA的重复行,如
id=1的第2行、id=2的第3行); - 分组内所有行都无NA的情况(如
id=4),全部保留,符合你提出的需单独核查矛盾数据的要求。
- 若分组内没有完整行(如
输出结果与预期一致:
# A tibble: 5 × 3 id val1 val2 <dbl> <dbl> <dbl> 1 1 10 10 2 2 10 10 3 3 20 NA 4 4 30 30 5 4 30 40
内容的提问来源于stack exchange,提问作者Nereus
相关产品推荐
相关产品推荐

