R 过滤掉递减值的段(附加条件)

R 过滤掉递减值的段(附加条件),r,vector,conditional-statements,filtering,R,Vector,Conditional Statements,Filtering,我正在编写一个脚本,以识别河流流量数据集的递减段,其中包括: x轴:时间(日期) y轴:流量 我想自动过滤掉特定条件下的递减段。段的定义如下: 段初始值最小为12 段结束部分应至少达到7.5,但可以降低 它主要包含递减值,但允许少量递增部分 容许增加部分的y位移小于当前段初始流量值的5%(即,对于15的初始流量,容许增加峰值小于0.75) 该段在下一次大幅增长之前结束 考虑到这些条件 我对该做什么感到困惑,我缺乏R知识,害怕错过一个明显的解决方案。我已经用以下代码获得了“峰值”索引(对

我正在编写一个脚本,以识别河流流量数据集的递减段,其中包括:

  • x轴:时间(日期)
  • y轴:流量

我想自动过滤掉特定条件下的递减段。段的定义如下:

  • 段初始值最小为12
  • 段结束部分应至少达到7.5,但可以降低
  • 它主要包含递减值,但允许少量递增部分
  • 容许增加部分的y位移小于当前段初始流量值的5%(即,对于15的初始流量,容许增加峰值小于0.75)
  • 该段在下一次大幅增长之前结束
考虑到这些条件

我对该做什么感到困惑,我缺乏R知识,害怕错过一个明显的解决方案。我已经用以下代码获得了“峰值”索引(对于流量>12):

## get a column with "1" for decreasing values and "0" for increasing values

df <- df %>% mutate(sign = NA)

sapply(1:nrow(df)-1, function(i){
  df$sign[i] <<- df$flow[i] - df$flow[i+1]
})

df <- df %>% mutate(sign=case_when(sign>=0 ~ 1, sign<0 ~ 0))

## get the indexes of the beginning of each decreasing segment

rle <- rle(df$sign)
rle$lengths <- cumsum(rle$lengths)
rle <- rle$lengths[which(rle$values==0)]
rle <- rle + 1

## only keep the indexes with flow > 12

rle <- rle[rle %in% which(df$flow>12)]
##获取一列,其中“1”表示递减值,“0”表示递增值
df%变异(符号=NA)
sapply(1:nrow(df)-1,功能(i){

df$sign[i]这里有一个使用
dplyr
datatable

library(data.table)
library(dplyr)

df = df %>% 
  arrange(date) %>%
  # flow*0.05 will add the 5% tolerance
  mutate(sign = case_when((flow-lead(flow))+(flow*0.05) >= 0 ~ 1, TRUE ~ 0)) %>%
  # group by run-length type id
  group_by(rleid(sign), sign) %>%
  filter(first(sign) == 1 & first(flow) >= 12 & min(flow) <= 7.5)
库(data.table)
图书馆(dplyr)
df=df%>%
安排(日期)%>%
#流量*0.05将增加5%的公差
变异(符号=案例_,当((流量引导(流量))+(流量*0.05)>=0~1,真值~0))%>%
#按运行长度类型id分组
分组人(rleid(符号),符号)%>%

过滤器(第一个(符号)==1&第一个(流量)>=12&分钟(流量)这里有一个使用
dplyr
datatable

library(data.table)
library(dplyr)

df = df %>% 
  arrange(date) %>%
  # flow*0.05 will add the 5% tolerance
  mutate(sign = case_when((flow-lead(flow))+(flow*0.05) >= 0 ~ 1, TRUE ~ 0)) %>%
  # group by run-length type id
  group_by(rleid(sign), sign) %>%
  filter(first(sign) == 1 & first(flow) >= 12 & min(flow) <= 7.5)
库(data.table)
图书馆(dplyr)
df=df%>%
安排(日期)%>%
#流量*0.05将增加5%的公差
变异(符号=案例_,当((流量引导(流量))+(流量*0.05)>=0~1,真值~0))%>%
#按运行长度类型id分组
分组人(rleid(符号),符号)%>%

过滤器(first(sign)=1和first(flow)>=12和min(flow)创建
sign
列可以通过使用
lead()
来简化。在这种情况下,它将是
df=df%>%变异(sign=case_当(flow-lead(flow)>=0~1,TRUE~0))
在我看来,你描述过滤数据帧的条件的方式可能更精确。你能让描述更清晰吗?另外,在你想要保留的内容的张贴图片中,红色部分是你想要保留的还是你想要去除的?@ChrisRuehlemann我编辑了描述,并试图更精确地描述e段条件。关于红色部分,它是我想要保留的部分。感谢根据数据和您的规格,我不确定您希望如何仅保留红色部分。例如:从第11行开始的组的初始值也将大于12,最小值为7.7,并且您想要保留的段具有最小值值为7.1,不符合条件。很抱歉,最低值可能会混淆。我希望段至少达到7.5或更低。这就是为什么您描述的段(来自第11行)不符合条件,因为没有达到至少7.5的流创建
符号
列可以使用
lead()简化
。在这种情况下,它将是
df=df%>%变异(符号=case_,当(流-导程(流)>=0~1,真~0))
在我看来,你描述过滤数据帧的条件的方式可能更精确。你能让描述更清晰吗?另外,在你想要保留的内容的张贴图片中,红色部分是你想要保留的还是你想要去除的?@ChrisRuehlemann我编辑了描述,并试图更精确地描述e段条件。关于红色部分,它是我想要保留的部分。感谢根据数据和您的规格,我不确定您希望如何仅保留红色部分。例如:从第11行开始的组的初始值也将大于12,最小值为7.7,并且您想要保留的段具有最小值值为7.1,不符合条件。很抱歉,最低值可能会混淆。我希望段至少达到7.5或更低。这就是您描述的段(第11行)的原因不符合条件,没有达到至少7.5的流量太棒了,谢谢,它工作得非常完美。我想不出那么简洁的东西!肯定帮助我理解了一些R力学。太棒了,谢谢,它工作得非常完美。我想不出那么简洁的东西!肯定帮助我理解了一些R力学。