如何按参与者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))
但计算结果不正确,且未按参与者正确分组,请帮忙实现需求。
解决方案
你的代码存在两个核心问题:
- 日期格式不匹配:原始数据的日期是
YYYY-MM-DD格式(比如2023-04-19),但你用了%y/%m/%d(两位年份+斜杠分隔)来转换,导致日期转换失败,后续计算自然出错。 - 计算逻辑错误:
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
相关产品推荐
相关产品推荐

