我正在处理极端干旱事件,并试图获得有关其特征的一些信息。 这是我的数据的示例:
dat <- data.frame(length= c(39,1,1,1,98,1,1,1,57,1,1,1,34,1,1), value = c(0,-1.111,-1.645,-1.285,0,-1.223,-1.369,-1.007,0,-1.083,-1.675,-1.119,0,-1.554,-1.6228))
行是月份,因此“长度”列标识为数字1的干旱月份,“值”列记录该干旱事件的严重程度。 我想要获得的是,一方面是干旱事件的中位数和最大长度,但将每组连续的干旱月份(长度= 1)视为一个事件(红色框);另一方面,我想计算该系列中所有干燥事件的严重程度的中位数和最小值。
此屏幕快照显示了我要获取的内容以及期望获取的值。
我的主要问题是如何将“长度”列中值为1的连续行的组视为唯一情况并计算这些简单的统计信息。
非常感谢您提供的任何帮助。
答案 0 :(得分:1)
一种选择是创建一个具有运行长度ID(rleid
)的分组变量,然后使用它来summarise
为median
,{{1} }和其他感兴趣的统计信息(即行数-min
)
n()
或与library(dplyr)
library(data.table)
dat %>%
group_by(grp = rleid(length == 1)) %>%
filter(length == 1) %>%
summarise(Length = n(), Median = median(value), Min = min(value))
相似,方法是先创建一个data.table
分组变量,并按'grp'分组,然后用逻辑表达式指定rleid
以将仅在“长度”中等于1,在“值”列中获得i
和median
(或min
)
max
答案 1 :(得分:1)
完整的dplyr
解决方案:
library(tidyverse)
dat2 <- dat %>%
mutate(zero_count = if_else(value == 0, 1, 0),
group_id = cumsum(zero_count)) %>%
filter(length == 1) %>%
group_by(group_id) %>%
summarise(mean = mean(value), median = median(value), months = length(group_id))
首先,我添加了一个新列来标记是否存在零值。 然后是一个新列,我们对其进行累加求和,以便可以依次/分别识别每个组。 然后按此新列分组,并过滤掉不属于其他行。 最后汇总以获取统计信息。
group_id mean median months
<dbl> <dbl> <dbl> <int>
1 1 -1.35 -1.28 3
2 2 -1.20 -1.22 3
3 3 -1.29 -1.12 3
4 4 -1.59 -1.59 2