繁体   English   中英

满足条件的连续行的总和

[英]Sum of consecutive rows if they meet a condition

我正在使用R分析包含干旱指数(SPEI)每月值的时间序列。 数据具有以下结构:

df <- data.frame(
  spei = c(-0.52677,-0.33412, -0.89412 ,0.83459,0.65078,-0.59507,-1.16728,-1.42036,-1.47762,-1.73324,-1.23006,-1.10954), 
  month = c(7:12, 1:6), 
  year = c(rep(1992, 6), rep(1993, 6))
)

我想根据以下定义获得干旱事件的持续时间:指数( spei )低于特定阈值(在这种情况下为-0.86)的连续月份数。

有什么帮助吗?

这是我如何解决问题的方法。 我们使用rle的结果找出当前条纹的lengths (使用rle lengths ),然后使用rle valueslengths创建drought变量:

r_l <- rle(df$spei <= -.86) #runs of drought variable

(drought_df <- data.frame(streak = unlist(sapply(r_l$lengths, FUN = function(x) 1:x)),
           drought = rep(r_l$values, r_l$lengths),
           stringsAsFactors = FALSE))

   streak drought
1       1   FALSE
2       2   FALSE
3       1    TRUE
4       1   FALSE
5       2   FALSE
6       3   FALSE
7       1    TRUE
8       2    TRUE
9       3    TRUE
10      4    TRUE
11      5    TRUE
12      6    TRUE

然后,您可以cbind到原始表:

cbind(df, drought_df)

       spei month year streak drought
1  -0.52677     7 1992      1   FALSE
2  -0.33412     8 1992      2   FALSE
3  -0.89412     9 1992      1    TRUE
4   0.83459    10 1992      1   FALSE
5   0.65078    11 1992      2   FALSE
6  -0.59507    12 1992      3   FALSE
7  -1.16728     1 1993      1    TRUE
8  -1.42036     2 1993      2    TRUE
9  -1.47762     3 1993      3    TRUE
10 -1.73324     4 1993      4    TRUE
11 -1.23006     5 1993      5    TRUE
12 -1.10954     6 1993      6    TRUE

编辑

如果您只想要最长的干旱期,可以使用:

max(subset(drought_df, drought)$streak) # subset drought_df for only drought periods
[1] 6

我仍然不知道预期的结果,但这可能会给您带来深刻的见解:

 transform(df,drought=ave(x<-spei<=-0.86, cumsum(!x), FUN = cumsum))
       spei month year drought
1  -0.52677     7 1992       0
2  -0.33412     8 1992       0
3  -0.89412     9 1992       1
4   0.83459    10 1992       0
5   0.65078    11 1992       0
6  -0.59507    12 1992       0
7  -1.16728     1 1993       1
8  -1.42036     2 1993       2
9  -1.47762     3 1993       3
10 -1.73324     4 1993       4
11 -1.23006     5 1993       5
12 -1.10954     6 1993       6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM