R 按顺序条件过滤,直到满足另一个条件

R 按顺序条件过滤,直到满足另一个条件,r,filter,dplyr,time-series,R,Filter,Dplyr,Time Series,如何创建过滤器以满足两个条件: 删除前一天值下降到80%以上的所有行 继续删除下降后的行,直到值再次上升到50以上 数据% 变异(diff=(值滞后(value,default=first(value)))/lag(value,default=first(value))) 最终输出应为: date value diff <date> <dbl> <dbl> 1 2021-01-01 89 0 2

如何创建过滤器以满足两个条件:

  • 删除前一天值下降到80%以上的所有行
  • 继续删除下降后的行,直到值再次上升到50以上
  • 数据%
    变异(diff=(值滞后(value,default=first(value)))/lag(value,default=first(value)))
    
    最终输出应为:

      date       value    diff
       <date>     <dbl>   <dbl>
     1 2021-01-01    89  0     
     2 2021-01-02    86 -0.0337
     3 2021-01-03    87  0.0116
     4 2021-01-04    76 -0.126 
     5 2021-01-06    90  8     
     6 2021-01-07    92  0.0222
     7 2021-01-08    83 -0.0978
     8 2021-01-12    51  1.22  
     9 2021-01-13    32 -0.373 
    10 2021-01-14    88  1.75  
    11 2021-01-15    92  0.0455
    
    
    日期值差异
    1 2021-01-01    89  0     
    2 2021-01-02    86 -0.0337
    3 2021-01-03    87  0.0116
    4 2021-01-04    76 -0.126 
    5 2021-01-06    90  8     
    6 2021-01-07    92  0.0222
    7 2021-01-08    83 -0.0978
    8 2021-01-12    51  1.22  
    9 2021-01-13    32 -0.373 
    10 2021-01-14    88  1.75  
    11 2021-01-15    92  0.0455
    
    以下是一种使用
    数据的方法。table::rleid

    库(dplyr)
    数据%
    mutate(diff=(value-lag(value,default=first(value)))/
    滞后(值,默认值=第一个(值)))%>%
    变异(删除=差异%
    #在第一次删除行后,计算删除到分组行的索引
    mutate(group_remove=data.table::rleid(to_remove))%>%
    #对于这些组,只要没有行达到值50
    #若要继续,删除变量的赋值为FALSE
    分组依据(分组删除)%>%
    变异(继续删除=(组删除>1)&!删除&
    总和(值>=50)=0%%>%
    #过滤器删除第一种条件差异<80%的行
    过滤器(!要删除)%>%
    #在删除尚未达到50的行之后继续筛选行
    筛选器(!要\u继续\u删除)
    #>#A tibble:11 x 6
    #>#组:组_移除[3]
    #>日期值差异到\u删除组\u删除到\u继续\u删除
    #>                                       
    #>2021-01-01 43 0假1假
    #>2021-01-02 47 0.0930假1假
    #>3 2021-01-03 87 0.851假1假
    #>42021-01-0476-0.126假1假
    #>5 2021-01-06 90 8假3假
    #>6 2021-01-07 92 0.0222假3假
    #>7 2021-01-08 83-0.0978假3假
    #>8 2021-01-12 51 1.22假5假
    #>9 2021-01-13 32-0.373假5假
    #>10221-01-14881 1.75假5假
    #>11 2021-01-15 92 0.0455假5假
    
    由(v2.0.0)于2021年5月10日创建


    更新:如果行的起始值低于50,请调整解决方案,使其不从第一组中删除行。

    这是一个不需要的列,我将在最终输出中删除它。还有一件事!如果连续值为100、5(减少95%)、10(增加100%)、15(增加50%)、16.5,您的预期结果是什么(10%增加),33(200%增加)。在值再次增加到50以上之前,只剩下100,因此
    c(100,5,10,15,16.5,33,51,40)
    序列只有
    c(100,51,40)
    事实上,即使下面的答案有效,它也不能很好地概括,特别是当你开始时的值小于50。我放弃了思考过程,并使用了新的标准来完成需要在shinyapp中完成的任务。我认为这可能是一个有缺陷的思考过程:)我会再次打扰你,(事实上,我发现这一点既有趣又有挑战性)A=c(102100,50,60,20100,5,10,15,1,33,50,53)的期望输出是什么由于此处的值下降了两次,下降了80%,但只上升了一次?请注意,如果在达到下降标准之前,前几个元素小于50,则此项不起作用。您可以分享失败案例的示例吗?将上一个数据集中的值列替换为
    c(43,47,87,76,10,90,92,83,12,15,23,51,32,88,92)
    。在最终输出中不应排除前两项。筛选后,值列应具有
    c(43,47,87,76,90,92,83,51,32,88,92)
    只需更新解决方案!完美!再次感谢:)
      date       value    diff
       <date>     <dbl>   <dbl>
     1 2021-01-01    89  0     
     2 2021-01-02    86 -0.0337
     3 2021-01-03    87  0.0116
     4 2021-01-04    76 -0.126 
     5 2021-01-06    90  8     
     6 2021-01-07    92  0.0222
     7 2021-01-08    83 -0.0978
     8 2021-01-12    51  1.22  
     9 2021-01-13    32 -0.373 
    10 2021-01-14    88  1.75  
    11 2021-01-15    92  0.0455