我使用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)。
有任何帮助吗?
答案 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