You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:10:49