[英]How do I calculate a rolling sum with variable levels of depletion in R?
我正在尝试使用R来衡量一个人在补充笔芯时手头已有多少天的处方,同时考虑到所有以前的处方。 例如,如果我有这张桌子...
member rx_id fill_date to_date days_supply
1 A 1 2018-10-01 2018-10-02 2
2 B 1 2016-11-07 2016-11-10 4
3 B 2 2016-11-07 2016-12-04 28
4 B 3 2016-11-08 2016-11-09 2
5 B 4 2016-11-10 2016-12-03 24
我希望以下输出
member rx_id fill_date to_date days_supply_on_hand
1 A 1 2018-10-01 2018-10-02 0
2 B 1 2016-11-07 2016-11-10 0
3 B 2 2016-11-07 2016-12-04 4
4 B 3 2016-11-08 2016-11-09 30
5 B 4 2016-11-10 2016-12-03 26
对于成员B,当第二个脚本与第一个脚本在同一天填写时,该个人手头上已经有4天的RX价值。 填写第三个脚本后,该人距离第一个脚本还有3天,而第二个脚本还有27天(总共30天)。 填写完第四个脚本后,第三个脚本将用完,但是第一个脚本还有1天,第三个脚本还有25天(总共26天)。
我知道如何在dplyr和data.table中进行滚动总计,但是我无法弄清楚如何根据以前的记录(逐个记录)来考虑可变的消耗水平。 下面是重新制作原始表的代码,在此先感谢您的任何建议!
structure(list(member = structure(c(1L, 2L, 2L, 2L, 2L), .Label =
c("A",
"B"), class = "factor"), rx_id = c(1, 1, 2, 3, 4), fill_date =
structure(c(17805,
17112, 17112, 17113, 17115), class = "Date"), to_date =
structure(c(17806,
17115, 17139, 17114, 17138), class = "Date"), days_supply = c(2,
4, 28, 2, 24)), .Names = c("member", "rx_id", "fill_date",
"to_date",
"days_supply"), row.names = c(NA, -5L), class = "data.frame")
library(data.table)
dt = as.data.table(your_df) # or setDT to convert in place
# merge on relevant days, then compute sum of supply - days elapsed
dt[dt, on = .(member, fill_date <= fill_date, to_date >= fill_date, rx_id < rx_id), by = .EACHI,
sum(days_supply, na.rm = T) - sum(i.fill_date - x.fill_date, na.rm = T)]
# member fill_date to_date rx_id V1
#1: A 2018-10-01 2018-10-01 1 0 days
#2: B 2016-11-07 2016-11-07 1 0 days
#3: B 2016-11-07 2016-11-07 2 4 days
#4: B 2016-11-08 2016-11-08 3 30 days
#5: B 2016-11-10 2016-11-10 4 26 days
使用一个简单的循环
dt$days_supply_on_hand <- 0
for (a in unique(dt$member)) {
I <- which(.subset2(dt,1) == a)
flDate <- as.integer(.subset2(dt,3)[I])
toDate <- as.integer(.subset2(dt,4)[I])
V <- vapply(seq_along(I), function (k) sum(toDate[1:(k-1)] - flDate[k] + 1), numeric(1))
dt$days_supply_on_hand[I] <- c(0,V[-1])
}
dt
member rx_id fill_date to_date days_supply days_supply_on_hand
1 A 1 2018-10-01 2018-10-02 2 0
2 B 1 2016-11-07 2016-11-10 4 0
3 B 2 2016-11-07 2016-12-04 28 4
4 B 3 2016-11-08 2016-11-09 2 30
5 B 4 2016-11-10 2016-12-03 24 26
其中dt
是上面提供的数据帧。 (请注意,使用.subset2
或as.integer
出于效率目的-可以更改它们以提高可读性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.