gpt4 book ai didi

r - 通过变量列表执行滚动求和的优雅、快速方法

转载 作者:行者123 更新时间:2023-12-04 20:08:19 25 4
gpt4 key购买 nike

有没有人开发出一种优雅、快速的方法来按日期执行滚动求和?例如,如果我想通过 Cust_ID 为以下数据集创建一个滚动的 180 天总计,有没有办法更快地完成它(如 data.table 中的某些内容)。我一直在使用以下示例来计算滚动总和,但恐怕效率太低了。

library("zoo")
library("plyr")
library("lubridate")

##Make some sample variables
set.seed(1)
Trans_Dates <- as.Date(c(31,33,65,96,150,187,210,212,240,273,293,320,
32,34,66,97,151,188,211,213,241,274,294,321,
33,35,67,98,152,189,212,214,242,275,295,322),origin="2010-01-01")
Cust_ID <- c(rep(1,12),rep(2,12),rep(3,12))
Target <- rpois(36,3)

##Combine into one dataset
Example.Data <- data.frame(Trans_Dates,Cust_ID,Target)

##Create extra variable with 180 day rolling sum
Example.Data2 <- ddply(Example.Data, .(Cust_ID),
function(datc) adply(datc, 1,
function(x) data.frame(Target_Running_Total =
sum(subset(datc, Trans_Dates>(as.Date(x$Trans_Dates)-180) & Trans_Dates<=x$Trans_Dates)$Target))))

#Print new data
Example.Data2

最佳答案

假设您的面板或多或少是平衡的,那么我怀疑 expand.gridave会很快(你必须用你的数据进行基准测试才能确定)。我用 expand.grid填补缺失的天数,这样我就可以天真地用 cumsum 计算滚动总和然后用 head 减去除最近的 180 之外的所有值.

- 作为对您(以及更熟练的 R 用户)的一个问题,为什么我的 identical通话总是失败?-

我建立在你相同的数据上。

full <- expand.grid(seq(from=min(Example.Data$Trans_Dates), to=max(Example.Data$Trans_Dates), by=1), unique(Example.Data$Cust_ID))
Example.Data3 <- merge(Example.Data, full, by.x=c("Trans_Dates", "Cust_ID"), by.y=c("Var1", "Var2"), all=TRUE)
Example.Data3 <- Example.Data3[with(Example.Data3, order(Cust_ID, Trans_Dates)), ]
Example.Data3$Target.New <- ifelse(is.na(Example.Data3$Target), 0, Example.Data3$Target)
Example.Data3$Target_Running_Total <- ave(Example.Data3$Target.New, Example.Data3$Cust_ID, FUN=function(x) cumsum(x) - c(rep(0, 180), head(cumsum(x), -180)))
Example.Data3$Target.New <- NULL
Example.Data3 <- Example.Data3[complete.cases(Example.Data3), ]
row.names(Example.Data3) <- seq(nrow(Example.Data3))
Example.Data3

identical(Example.Data2$Target_Running_Total, Example.Data3$Target_Running_Total)
sum(Example.Data2$Target_Running_Total - Example.Data3$Target_Running_Total)
(Example.Data2$Target_Running_Total - Example.Data3$Target_Running_Total)

产生以下结果。
> (Example.Data2$Target_Running_Total - Example.Data3$Target_Running_Total) 
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

关于r - 通过变量列表执行滚动求和的优雅、快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com