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

基于优先级与时间规则筛选R语言data.table数据集的方法

解决data.table的疾病优先级与日期筛选问题

给定如下data.table数据集(修正了原代码中disease未加引号的错误,否则会触发变量未定义报错):

library(data.table)
dt <- data.table(ID = c(1,1, 2, 2, 3, 3, 4, 4),
                 disease = c("A", "B", "B", "C", "D", "A", "B", "B"), 
                 date = c("2020-03-02", "2020-03-02", "2020-03-01", "2020-03-01", "2020-03-03", "2020-03-03", "2020-02-02", "2011-01-01"))

需要满足两个筛选规则:

  • 同一ID同一日期存在不同疾病时,按A>B>C>D的优先级保留对应记录;
  • 同一ID同一疾病存在不同日期时,保留日期最早的记录。

解决代码

# 加载data.table包
library(data.table)

# 初始化并预处理数据集
dt <- data.table(ID = c(1,1, 2, 2, 3, 3, 4, 4),
                 disease = c("A", "B", "B", "C", "D", "A", "B", "B"), 
                 date = as.Date(c("2020-03-02", "2020-03-02", "2020-03-01", "2020-03-01", "2020-03-03", "2020-03-03", "2020-02-02", "2011-01-01")))

# 定义疾病优先级顺序
priority_levels <- c("A", "B", "C", "D")
# 将disease转为有序因子,确保排序时优先级高的在前
dt[, disease := factor(disease, levels = priority_levels, ordered = TRUE)]

# 按ID分组,先按疾病优先级排序,再按日期升序排序,取每组第一条记录
dt_final <- dt[order(ID, disease, date), .SD[1], by = ID]

# 可选:将disease转回字符型(如果不需要因子类型)
dt_final[, disease := as.character(disease)]

# 查看结果
print(dt_final)

输出结果

ID disease       date
1:  1       A 2020-03-02
2:  2       B 2020-03-01
3:  3       A 2020-03-03
4:  4       B 2011-01-01

代码说明

  • as.Date(date):将字符串格式日期转为Date类型,保证日期比较的准确性;
  • factor(disease, levels = priority_levels, ordered = TRUE):把疾病转为有序因子,强制指定优先级顺序,排序时A会排在最前,依次为B、C、D;
  • order(ID, disease, date):先按ID分组,同一ID内先按疾病优先级排序,再按日期升序排序,确保优先级高、日期早的记录排在每组最前面;
  • .SD[1], by = ID:按ID分组后取每组第一条记录,同时满足两个筛选规则。

内容的提问来源于stack exchange,提问作者Hellihansen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:45