如何用dplyr和tidyr删除首次评估含NA的ID所有观测?
解决方案:删除首次评估含NA的ID的所有观测
针对你的需求,这里提供两种基于dplyr的实现方式,都能达到排除首次评估(assessment == 1)存在任意NA值的ID的所有记录的目的:
方法一:分组后直接过滤
通过按id分组,直接检查每组首次评估行中指定列是否存在NA,保留无NA的组:
library(dplyr) cleaned_dataset <- dataset %>% group_by(id) %>% # 检查首次评估时scoreA和scoreB是否无任意NA filter(!any(is.na(c_across(scoreA:scoreB))[assessment == 1])) %>% ungroup()
代码说明:
group_by(id):按ID分组处理每个个体的所有记录c_across(scoreA:scoreB):选中需要检查NA的分数列[assessment == 1]:仅提取该组中首次评估的行数据!any(is.na(...)):判断该组首次评估的行是否不存在任何NA,满足条件则保留整个组的记录
方法二:先筛选有效ID再过滤
先找出所有首次评估时无NA的ID列表,再用该列表过滤原数据集,逻辑更直观:
library(dplyr) # 提取首次评估时scoreA和scoreB均无NA的ID valid_ids <- dataset %>% filter(assessment == 1) %>% filter(!is.na(scoreA) & !is.na(scoreB)) %>% pull(id) # 用有效ID过滤原数据集 cleaned_dataset <- dataset %>% filter(id %in% valid_ids)
代码说明:
- 第一步先筛选出所有首次评估的记录,再过滤掉存在NA的行,最后提取这些有效ID
- 第二步用
id %in% valid_ids保留所有有效ID的全部观测
结果验证
处理后的cleaned_dataset将仅包含ID 1、3、4的所有记录,ID 2和5的所有观测已被排除,符合你的需求。
内容的提问来源于stack exchange,提问作者DrNight
相关产品推荐
相关产品推荐

