Хорошо, все изменилось, и мы должны снова набрать это .
Нам нужен еще один floodFun
, который подходит для нескольких столбцов.
floodFun <- function(floodcol, datecol, e=date.end2, p=period2) {
fc2 <- Vectorize(function(x, y, ...) {
e <- as.Date(e[x])
p <- p[y]
# stopifnot(!anyNA(c(e, p)))
# stopifnot((e - p) %in% datecol)
if (anyNA(c(e, p)) | !((e - p) %in% datecol))
S <- NA
else
S <- sum(floodcol[which(datecol == e - p + 1):which(datecol == e)])
})
res <- outer(seq_along(date.end2), seq(period2), fc2)
return(res)
}
В отношении значения ячейки лучше всего было бы sapply
в 3D-массив,
A <- sapply(df2[-1], function(x)
`dimnames<-`(floodFun(x, df2$date, e=date.end2, p=period2),
list(as.character(date.end2), period2)), simplify="array")
, где мы можем легко извлечь средства.
apply(A, 1:2, mean)
# 30 60 90
# 2018-05-02 17.33333 33.33333 48.33333
# 2018-06-19 15.66667 30.66667 47.00000
# 2018-06-25 15.66667 30.00000 47.33333
# 2018-08-01 12.66667 29.33333 43.00000
# 2018-08-10 12.00000 29.33333 43.00000
# 2018-09-08 13.33333 25.66667 43.00000
# 2018-09-26 12.33333 27.33333 39.33333
# 2018-10-19 16.33333 27.66667 42.33333
# 2018-10-24 16.33333 28.66667 43.66667
# 2018-10-26 16.00000 28.33333 43.33333
Для «промежуточного шага» выполните
tmp <- Map(function(x) `dimnames<-`(floodFun(x, df2$date, e=date.end2, p=period2),
list(as.character(date.end2), period2)), df2[-1])
RES <- do.call(cbind, lapply(tmp, function(x)
`colnames<-`(x, paste(colnames(x), names(tmp), sep="."))))
Данные
set.seed(42)
df2 <- data.frame(date=seq(as.Date("2016-11-01"), as.Date("2018-11-01"), "day"),
flooded.1=rbinom(731, 1, .5), flooded.2=rbinom(731, 1, .5),
flooded.3=rbinom(731, 1, .5))
date.end2 <- sort(sample(tail(df2$date, 200), 10)) # I chose `tail` to avoid NAs
period2 <- c(30, 60, 90)