如何用R data.table基于同表多条件条件性删除数据行?
用data.table语法实现按组条件删除行
首先复现你的数据集:
library(data.table) DT <- data.table(Subject=c("A","A","B","B"), Test=c("TEST_A","TEST_A","TEST_A","TEST_A"), Folder=c("D1","Screen","D1","Screen"), Date=as.Date(c("2001-10-22","2001-10-23","2001-10-23","2001-10-25"))) DT[3, Date := NA] DT
针对你的需求,我们可以利用data.table的分组计算能力,先标记每个Subject组的关键特征,再筛选删除目标行,全程用data.table语法实现:
# 1. 按Subject分组,添加两个标记列:是否存在TEST_A+D1+空Date的行、是否存在TEST_A+Screen+非空Date的行 DT[, c("has_d1_na", "has_screen_notna") := .( any(Test == "TEST_A" & Folder == "D1" & is.na(Date)), any(Test == "TEST_A" & Folder == "Screen" & !is.na(Date)) ), by = Subject] # 2. 筛选保留符合要求的行:删除同时满足「是TEST_A+D1+空Date」且「该组同时存在D1空和Screen非空」的行 DT <- DT[!(Test == "TEST_A" & Folder == "D1" & is.na(Date) & has_d1_na & has_screen_notna)] # 3. 移除临时标记列,恢复原数据结构 DT[, c("has_d1_na", "has_screen_notna") := NULL] DT
逻辑说明
- 分组计算的两个标记列,用来判断每个Subject是否满足你要求的前置条件:既存在
TEST_A+D1+空Date的行,又存在TEST_A+Screen+非空Date的行。 - 筛选步骤精准定位需要删除的行:只有当行本身是
TEST_A+D1+空Date,且所属Subject符合上述前置条件时,才会被删除。 - 最后移除临时列,保证输出数据和原结构一致。
运行后得到的结果:
Subject Test Folder Date 1: A TEST_A D1 2001-10-22 2: A TEST_A Screen 2001-10-23 3: B TEST_A Screen 2001-10-25
内容的提问来源于stack exchange,提问作者user14543207
相关产品推荐
相关产品推荐

