R 如何在没有循环的情况下对数据帧的n个元素的移动子集执行计算

R 如何在没有循环的情况下对数据帧的n个元素的移动子集执行计算,r,R,我正在尝试使用R计算有效干旱指数。其中一个步骤是计算蓄水量(EP): EP365=P1/1+(P1+P2)/2+(P1+P2+P3)/3+(P1+P2+P3+P4)/4+…+(P1+…+P365)/365 其中P1为最后一天的日降水量,P2为两天前的降水量,P365为365天前的降水量。从第1天到第365天、第2天到第366天等开始,必须计算每365天的EP 所以我有一个包含两列的数据框:date和precip,以及超过20000行。简单(且缓慢)的解决方案是计算从第365行到nrow(df)的

我正在尝试使用R计算有效干旱指数。其中一个步骤是计算蓄水量(EP):

EP365=P1/1+(P1+P2)/2+(P1+P2+P3)/3+(P1+P2+P3+P4)/4+…+(P1+…+P365)/365

其中P1为最后一天的日降水量,P2为两天前的降水量,P365为365天前的降水量。从第1天到第365天、第2天到第366天等开始,必须计算每365天的EP

所以我有一个包含两列的数据框:date和precip,以及超过20000行。简单(且缓慢)的解决方案是计算从第365行到nrow(df)的365个元素的任何子集:


period\u length使用带有指示功能的
rollappyr
。如果您希望其在前364个积分期间的工作时间少于365天,则将
fill=NA
替换为
partial=TRUE
,如果您希望降低前364个积分,则将两者都忽略

library(zoo)
x <- 1:1000 # sample data
ep <- rollapplyr(x, 365, function(x) sum(cumsum(x) / seq_along(x)), fill = NA)
图书馆(动物园)

x使用带有指示功能的
rollappyr
。如果您希望其在前364个积分期间的工作时间少于365天,则将
fill=NA
替换为
partial=TRUE
,如果您希望降低前364个积分,则将两者都忽略

library(zoo)
x <- 1:1000 # sample data
ep <- rollapplyr(x, 365, function(x) sum(cumsum(x) / seq_along(x)), fill = NA)
图书馆(动物园)

非常感谢,就是这样:)当然,我必须在我的情况下做rev(x)。遗憾的是,我不能反馈这个答案:(没问题@Piotr。我能做到:)非常感谢,就是这样:)当然我必须做rev(x)在我的情况下。遗憾的是,我不能反馈这个答案:(没问题@Piotr。我能做到:)