R 在每年的固定日期开始计算总和()
我想积累一个长期(包括不同年份)每天测量的变量。变量的累积应该从一年中的某一固定日期开始(例如,2月1日,或者换句话说,一年中的某一天(doy)32-我在doy工作)。每年的累积金额应在此固定日期开始计算R 在每年的固定日期开始计算总和(),r,flags,cumsum,R,Flags,Cumsum,我想积累一个长期(包括不同年份)每天测量的变量。变量的累积应该从一年中的某一固定日期开始(例如,2月1日,或者换句话说,一年中的某一天(doy)32-我在doy工作)。每年的累积金额应在此固定日期开始计算 我尝试使用 SEDT(DF)[,WaTiWa:= CuSUM(变量),by=ReID(DOY>=32)] >或代码> RLE(DOY>=32)但它们都不考虑每年的第一天。 理论上,函数ave()应该可以正常工作,但我不知道如何在不同年份的doy之间创建标志变量(它通常只创建第一个) df让我
我尝试使用<代码> SEDT(DF)[,WaTiWa:= CuSUM(变量),by=ReID(DOY>=32)] <或> >或代码> RLE(DOY>=32)但它们都不考虑每年的第一天。
理论上,函数ave()
应该可以正常工作,但我不知道如何在不同年份的doy之间创建标志变量(它通常只创建第一个)
df让我们从一个函数接口开始,它是一个函数列表,以及它们的输入和输出,可以解决这个问题
函数reset_cum_sums
包含两个元素,一个向量和该向量的重置位置列表。输出将是一个包含累积和的向量,和将在向量的每个所需位置重新开始。举一个例子可以更清楚地说明这一点:
在每个重置位置,累积总和重置。因此,如果输入为1:10
,位置向量为3 5 7
,则输出为
输入:[1 2 3 4 5 6 7 8 9 10]
输出:[1 3 3 7 5 11 7 15 24 34]
如果没有给出任何位置,这将产生与cumsum
相同的结果
is_feb_1st
将返回TRUE
如果日期是二月一日,则返回FALSE
否则返回。我将把这作为练习留给你
功能界面使用基本函数,split
,以及lapply
,这些函数的文档留作练习阅读
现在,解决方案的大纲可以写为:
restart\u feb\u first%lapply(cumsum)%%>%unlist(use.names=FALSE)
}
下面是函数的调用方式
#示例
重置总和(值、位置)
重置总和(代表(1,50),位置)
我希望这能指导您找到适合您需要的解决方案。关键的概念是将其分解,直到找到一个“容易”用R原语编写的函数。如果您需要reset\u cum\u sums
来提高效率,那么用C或data.table
编写应该相当容易,但我们还是改天再说吧
更新
此函数返回一个向量,因此要将其用于数据表包,只需添加一个赋值,如中所示
DT[,new_column:=reset_sum(value,,isFebFirst(date)]
斯库梅德斯,欢迎来到SO!我们无法具体回答您,因为我们不知道您的数据,也不知道您尝试过什么代码。请重复这个问题。这包括示例代码(包括列出非base R包)、示例明确数据(例如,dput(head(x))
或data.frame(x=…,y=…)
)和预期输出。参考文献:,和。
DT[,new_column:=reset_sum(value,,isFebFirst(date)]