如何在R的data.table中筛选全指定月份Tier为Reg的ID?
解决data.table筛选全月份符合条件ID的问题
你的原代码逻辑存在偏差:它仅提取了存在1-3月中Tier为Reg的ID,但C在1、3月是Reg,因此被错误包含。你需要的是所有指定月份(1、2、3月)里Tier均为Reg的ID,以下是两种可行方案:
方案一:分组校验全量符合条件
借助data.table的分组功能,按ID分组后校验该ID在指定月份内的Tier是否全部为Reg:
# 简洁写法 DT[Month %in% c(1,2,3)][, if (all(Tier == 'Reg')) ID, by = ID][, unique(ID)]
分步拆解更清晰:
- 先筛选出指定月份的数据:
filtered_dt <- DT[Month %in% c(1,2,3)]
- 按ID分组,检查每个ID的Tier是否全为
Reg:
check_result <- filtered_dt[, .(all_reg = all(Tier == 'Reg')), by = ID]
- 提取符合条件的ID:
valid_ids <- check_result[all_reg == TRUE, ID]
方案二:排除不符合条件的ID
先找出存在指定月份里Tier不为Reg的ID,再从原数据中排除这些ID:
# 找出有违规记录的ID invalid_ids <- DT[Month %in% c(1,2,3) & Tier != 'Reg', unique(ID)] # 排除违规ID,提取有效ID valid_ids <- DT[!ID %in% invalid_ids, unique(ID)]
两种方案运行后都会返回A和B,符合预期需求。
内容的提问来源于stack exchange,提问作者H_A
相关产品推荐
相关产品推荐

