基于优先级与时间规则筛选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
相关产品推荐
相关产品推荐

