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

如何按参与者ID分组计算纵向调查数据的基线后天数

问题:计算纵向调查数据中每个参与者的基线后天数

我有长格式的纵向调查数据,需要计算每个参与者的基线后天数——将每个参与者的首个日期设为基线(天数为0),后续日期计算与该基线的天数差。

原始数据

Participant     Date
1               2023-04-19
1               2023-05-01 
1               2023-05-16
2               2023-11-04 
2               2023-11-14
3               2024-01-02
3               2024-01-15
3               2024-02-01

期望结果

Participant     Date         Days since BL
1               2023-04-19      0
1               2023-05-01      12 
1               2023-05-16      27
2               2023-11-04      0
2               2023-11-14      10
3               2024-01-02      0
3               2024-01-15      14
3               2024-02-01      31

尝试的错误代码

df <- df %>%
group_by(Participant) %>%
mutate(Date = as.Date(Date, format='%y/%m/%d')) %>%
mutate(DIFF=Date - lag(Date))

但计算结果不正确,且未按参与者正确分组,请帮忙实现需求。


解决方案

你的代码存在两个核心问题:

  1. 日期格式不匹配:原始数据的日期是YYYY-MM-DD格式(比如2023-04-19),但你用了%y/%m/%d(两位年份+斜杠分隔)来转换,导致日期转换失败,后续计算自然出错。
  2. 计算逻辑错误:lag(Date)是取当前行的上一行日期做差值,而你需要的是和每个参与者的第一条基线日期做差值。

以下是修正后的代码:

library(dplyr)

# 先统一转换日期格式,匹配原始数据的YYYY-MM-DD格式
df <- df %>%
  mutate(Date = as.Date(Date, format = "%Y-%m-%d")) %>%
  # 按参与者分组,确保每组单独计算基线
  group_by(Participant) %>%
  # 计算当前日期与组内第一条基线日期的天数差,转成数值型
  mutate(`Days since BL` = as.numeric(Date - first(Date))) %>%
  # 取消分组(可选,根据后续操作需求调整)
  ungroup()

代码说明

  • as.Date(Date, format = "%Y-%m-%d"):正确匹配原始数据的日期格式,将字符型日期转换为可计算的日期类型。
  • group_by(Participant):按参与者分组,保证每个参与者的基线计算独立进行。
  • first(Date):提取每个参与者组内的第一条日期,也就是该参与者的基线日期。
  • as.numeric(Date - first(Date)):日期相减得到时间差对象,转换为数值型后直接得到天数差,基线日期的差值自动为0,完全符合需求。

运行后即可得到你期望的结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:30:20