Databricks中R脚本:按pid-med组调整difftime最后输出为24小时
问题:按pid-med组计算时间间隔并设置组内最后一条记录为24小时
需求描述
- 按
pid、med、date1对数据排序后,计算相邻date1条目之间的小时时间间隔 - 每个由相同
pid和med构成的组中,将最后一条date1记录对应的hours_output手动设置为24小时;当pid或med变更时,终止前一个组并将其最后值设为24
原始数据
df <- data.frame( pid = c(1,1,1,1,1), med = c("drugA", "drugA", "drugA", "drugB", "drugB"), date1 = as.POSIXct(c( "2023-02-02 09:00:00", "2023-02-02 12:00:00", "2023-02-02 14:00:00", "2023-02-03 10:00:00", "2023-02-03 18:00:00" )) )
尝试的代码
df1 <- df %>% arrange(pid, med, date1) %>% mutate(hours_output = as.numeric(difftime(lead(date1), date1, units = "hours"))) # Replace the last duration value with 24 hours df1$hours_output[last(nrow(df1))] <- 24 df1 <- df1 %>% select(med, date1, hours_output) head(df1)
实际输出
pid med date1 hours_output 1 1 drugA 2023-02-02 09:00:00 3.00 2 1 drugA 2023-02-02 12:00:00 2.00 3 1 drugA 2023-02-02 14:00:00 20.00 4 1 drugB 2023-02-03 10:00:00 8.00 5 1 drugB 2023-02-03 18:00:00 18.00
期望输出
pid med date1 hours_output 1 1 drugA 2023-02-02 09:00:00 3.00 2 1 drugA 2023-02-02 12:00:00 2.00 3 1 drugA 2023-02-02 14:00:00 24.00 4 1 drugB 2023-02-03 10:00:00 8.00 5 1 drugB 2023-02-03 18:00:00 24.00
解决方案
原代码仅修改了整个数据集的最后一行,未按pid+med分组处理。通过group_by()实现组内独立计算,再针对组内最后一行设置24小时即可:
library(dplyr) df1 <- df %>% arrange(pid, med, date1) %>% group_by(pid, med) %>% mutate( hours_output = as.numeric(difftime(lead(date1), date1, units = "hours")), # 组内最后一行替换为24小时 hours_output = ifelse(row_number() == n(), 24, hours_output) ) %>% ungroup() %>% select(pid, med, date1, hours_output) print(df1)
代码说明
group_by(pid, med):按患者ID和药物分组,保证每个组的处理互不干扰row_number() == n():判断当前行是否为组内最后一行(n()返回组内总条数)ifelse逻辑:组内最后一行强制设为24,其余行保留计算的小时间隔ungroup():取消分组状态,避免影响后续数据操作
运行后即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者db2020
相关产品推荐
相关产品推荐

