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

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. 分组逻辑错误:如果同时按日期+年龄组分组,每个分组仅包含1行数据,lag()无法取到前序值就会返回NA
  2. 未按日期排序:分组内如果时间顺序混乱,lag()取到的不是前一天的累计值,就会出现负数或者不符合预期的结果
  3. 未设置lag的默认值:如果不设置default = 0,每个分组的第一行lag返回NA,计算出来的numdose首行就为NA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:24:03