You need to enable JavaScript to run this app. R语言使用dplyr按受试者、事件取最新观测的实现咨询
优惠活动
大模型
产品
解决方案
定价
更多

R语言使用dplyr按受试者、事件取最新观测的实现咨询

问题修正与实现方案

你写的代码核心问题出在分组逻辑上:连续两次调用group_by()时,第二次调用会直接覆盖第一次设置的分组条件,最终只会按EVENT单维度分组,完全丢失了按受试者区分的逻辑,自然跑不出预期结果。

正确实现步骤

  • 调整分组方式:把需要共同生效的分组维度(受试者ID列、事件类型列)直接写到同一个group_by()的参数里,dplyr会自动按所有维度的交叉组合完成分组,不需要分开多次写group_by
  • 修正细节错误:
    • 原数据里受试者ID列名是DE_ID,不是你代码里写的ID,列名不匹配会直接报错
    • 原数据的日期格式是%Y-%m-%d,不是你代码里写的%Y/%m/%d,格式不匹配转日期时会生成NA值,导致取值逻辑失效
  • 处理完分组计算后记得调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 05:45:05