R语言使用dplyr按受试者、事件取最新观测的实现咨询
问题修正与实现方案
你写的代码核心问题出在分组逻辑上:连续两次调用group_by()时,第二次调用会直接覆盖第一次设置的分组条件,最终只会按EVENT单维度分组,完全丢失了按受试者区分的逻辑,自然跑不出预期结果。
正确实现步骤
- 调整分组方式:把需要共同生效的分组维度(受试者ID列、事件类型列)直接写到同一个
group_by()的参数里,dplyr会自动按所有维度的交叉组合完成分组,不需要分开多次写group_by - 修正细节错误:
- 原数据里受试者ID列名是
DE_ID,不是你代码里写的ID,列名不匹配会直接报错 - 原数据的日期格式是
%Y-%m-%d,不是你代码里写的%Y/%m/%d,格式不匹配转日期时会生成NA值,导致取值逻辑失效
- 原数据里受试者ID列名是
- 处理完分组计算后记得调用
ungroup()解除分组,避免后续操作被残留的分组逻辑影响
基础实现代码
library(dplyr) df %>% # 同时按「受试者ID + 事件类型」交叉分组 group_by(DE_ID, EVENT) %>% # 取每组内日期最新的记录 slice(which.max(as.Date(EVENT_DATE_TIME, format = "%Y-%m-%d"))) %>% ungroup()
性能优化写法
如果数据量比较大,可以提前把日期列转成标准日期格式,用dplyr内置的slice_max函数替代手写的which.max逻辑,代码更简洁也不容易出错:
library(dplyr) df %>% # 提前统一转换日期格式 mutate(EVENT_DATE_TIME = as.Date(EVENT_DATE_TIME, format = "%Y-%m-%d")) %>% group_by(DE_ID, EVENT) %>% # 取每组最新1条记录,默认会保留同一天的所有记录,如果只需要1条可以加参数 with_ties = FALSE slice_max(EVENT_DATE_TIME, n = 1) %>% ungroup()
内容的提问来源于stack exchange,提问作者Ava Wilson
相关产品推荐
相关产品推荐

