将具有相同值的行分组

时间:2019-01-24 10:28:58

标签: r

我正在处理极端干旱事件,并试图获得有关其特征的一些信息。 这是我的数据的示例:

   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)视为一个事件(红色框);另一方面,我想计算该系列中所有干燥事件的严重程度的中位数和最小值。

此屏幕快照显示了我要获取的内容以及期望获取的值。

enter image description here

我的主要问题是如何将“长度”列中值为1的连续行的组视为唯一情况并计算这些简单的统计信息。

非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

一种选择是创建一个具有运行长度ID(rleid)的分组变量,然后使用它来summarisemedian,{{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,在“值”列中获得imedian(或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
相关问题