如果满足条件,则为连续行的总和

时间:2018-02-06 15:39:43

标签: r

我使用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)。

有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

这是我如何解决问题的方法。我们使用rle的结果来查找当前条纹的持续时间(使用lengths中的rle),然后使用drought创建values变量}和来自lengths的{​​{1}}:

rle

然后你可以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

答案 1 :(得分:1)

我仍然不知道预期的结果,但这也可能提供一个见解:

 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