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)
- 该段在下一次大幅增长之前结束
## 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力学。