R 在每年的固定日期开始计算总和()

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让我

我想积累一个长期(包括不同年份)每天测量的变量。变量的累积应该从一年中的某一固定日期开始(例如,2月1日,或者换句话说,一年中的某一天(doy)32-我在doy工作)。每年的累积金额应在此固定日期开始计算

我尝试使用<代码> 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)]