Используя data.table
и lubridate
, у вас есть эта опция:
library(data.table)
library(lubridate)
dt <- data.table(id=c(1:5))
dt$Date <- c("02/08/2013", "02/08/2013", "03/08/2013", "03/08/2013", "04/08/2013")
dt$Value <- c(1,4,5,2,4)
dt$Date <- dmy(dt$Date)
cummean <- function(d){
if(nrow(dt[Date<d])>0)
dt[Date<d, sum(Value)/.N]
else 0
}
dt[, accuMean:=mapply(cummean,Date)]
# id Date Value accuMean
#1: 1 2013-08-02 1 0.0
#2: 2 2013-08-02 4 0.0
#3: 3 2013-08-03 5 2.5
#4: 4 2013-08-03 2 2.5
#5: 5 2013-08-04 4 3.0
Решение, когда у вас есть несколько значений:
library(data.table)
library(lubridate)
dt <- data.table(id=c(1:5))
dt$Date <- c("02/08/2013", "02/08/2013", "03/08/2013", "03/08/2013", "04/08/2013")
dt$Value_1 <- c(1,4,5,2,4)
dt$Value_2 <- c(3,2,0,1,2)
dt$Value_3 <- c(4,9,3,3,3)
dt$Date <- dmy(dt$Date)
cummean <- function(d,Value){
if(nrow(dt[Date<d])>0)
sum(dt[Date<d, Value, with=F])/dt[Date<d, .N]
else 0
}
n <- 3
accuMean <- paste0("accuMean_", (1:n))
for(i in 1:n){
print(i)
dt[, (accuMean[i]):=mapply(cummean,Date,MoreArgs = list(paste0("Value_",i)))]
}
Предположим, у вас есть n значений с именем Value_i.Десять в вашем случае, вам нужно только установить n = 10