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
数据%
变异(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