R语言中按多分组变量计算反向累计和以获取当日实际给药量
解决方案
你可以通过dplyr的分组差分逻辑实现需求,核心是仅按年龄组分组、保证组内日期顺序正确,再用lag()函数取前一天的累计值做差:
library(dplyr) # 读入你提供的模拟数据 df <- structure(list(test_dates = structure(c(17897, 17897, 17897, 17897, 17897, 17898, 17898, 17898, 17898, 17898, 17899, 17899, 17899, 17899, 17899, 17900, 17900, 17900, 17900, 17900, 17901, 17901, 17901, 17901, 17901, 17902, 17902, 17902, 17902, 17902, 17903, 17903, 17903, 17903, 17903, 17904, 17904, 17904, 17904, 17904, 17905, 17905, 17905, 17905, 17905, 17906, 17906, 17906, 17906, 17906), class = "Date"), test_ages = structure(c(1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L, 1L, 5L, 3L, 2L, 4L ), .Label = c("<18", "18-29", "30-39", "40-49", "50+"), class = c("ordered", "factor")), cumudose = c(50, 200, 300, 400, 20, 60, 220, 317, 450, 28, 90, 330, 350, 460, 38, 150, 400, 400, 500, 50, 175, 453, 429, 574, 69, 182, 491, 474, 601, 102, 205, 506, 491, 682, 176, 235, 516, 568, 821, 199, 250, 525, 596, 850, 260, 294, 533, 667, 888, 277)), row.names = c(NA, -50L), class = "data.frame") # 计算每日实际给药量 df_result <- df %>% group_by(test_ages) %>% arrange(test_dates, .by_group = TRUE) %>% mutate(numdose = cumudose - lag(cumudose, default = 0)) %>% ungroup()
运行后输出的前10行完全符合你给出的预期结果。
之前结果异常的原因
- 分组逻辑错误:如果同时按日期+年龄组分组,每个分组仅包含1行数据,
lag()无法取到前序值就会返回NA - 未按日期排序:分组内如果时间顺序混乱,
lag()取到的不是前一天的累计值,就会出现负数或者不符合预期的结果 - 未设置
lag的默认值:如果不设置default = 0,每个分组的第一行lag返回NA,计算出来的numdose首行就为NA
内容的提问来源于stack exchange,提问作者eliseabril
相关产品推荐
相关产品推荐

