如何汇总和计数由零包围的多列数据

时间:2019-09-26 15:57:41

标签: r

我正在使用气候降水数据集,需要确定一次降水事件的持续时间(连续几天),然后通过对一个事件的总降雨量求和来总结这些事件。我当前的数据集如下:

> head(AcademyPH)
  X     X1_1 X2       X3 X4 X5        X6        X7        X8        X9 X10       X11       X12       X13       X14 X15 X16
1 1 2.802768  0 8.731085  0  0 0.0000000 0.0000000 0.1541449 0.5672905   0 0.0000000 0.0000000 1.6186382 4.2717023   0   0
2 2 0.000000  0 3.719260  0  0 0.0000000 0.0000000 0.0000000 0.0000000   0 0.0000000 0.0000000 0.8940655 2.2009878   0   0
3 3 0.000000  0 0.000000  0  0 0.7709681 0.0000000 0.6604212 0.0000000   0 0.0000000 1.9516009 1.3570352 0.0000000   0   0
4 4 0.000000  0 0.000000  0  0 0.0000000 0.0000000 0.0000000 0.0000000   0 0.0000000 0.8212746 0.0000000 0.0000000   0   0
5 5 0.000000  0 1.072659  0  0 0.0000000 0.7867589 0.0000000 0.0000000   0 0.2612132 0.0000000 0.0000000 0.5075513   0   0
6 6 0.000000  0 2.604247  0  0 0.3344550 0.0000000 0.0000000 0.0000000   0 0.0000000 0.0000000 0.0000000 0.1674422   0   0

数据框中总共有32列数据(每个气候模型均不同)。对于每个模型,我想生成一个新列,其中包含降雨事件持续时间的计数值,以及一个列,用于同一降雨事件的降雨总和。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

处理此问题的一种方法是创建一列以识别降雨事件,然后基于该列进行汇总。

tidyverse解决方案:

library(dplyr)
library(tidyr)


my.data <- AcademyPH %>%
      gather(key = "Model", value = "Rainfall", 2:17) %>% 
      group_by(Model) %>%
      mutate(Event = cumsum((Rainfall>0&lag(Rainfall, default = 0)==0)|(Rainfall==0&lag(Rainfall, default = 0)>0))) %>%
      group_by(Model,Event) %>%
      summarize(
            Duration = n(),
            EventRainfal = sum(Rainfall),
            MaxRain = max(Rainfall)
      ) %>%
      ungroup()

head(my.data, 10)  # more rows so you can see differences between Event rainfall and max rainfall

# A tibble: 10 x 5
# Groups:   Model [5]
#   Model Event Duration EventRainfal MaxRain
#   <chr> <int>    <int>        <dbl>   <dbl>
# 1 X1_1      1        1        2.80    2.80 
# 2 X1_1      2        5        0       0    
# 3 X10       0        6        0       0    
# 4 X11       0        4        0       0    
# 5 X11       1        1        0.261   0.261
# 6 X11       2        1        0       0    
# 7 X12       0        2        0       0    
# 8 X12       1        2        2.77    1.95 
# 9 X12       2        2        0       0    
#10 X13       1        3        3.87    1.62 

在结果表中,每个原始列均在“模型”下表示,在“降雨”与“干旱”的每个时期,事件持续多长时间以及降雨量下,在“事件”下均具有一个值。然后,您可以对此进行过滤以仅包含降雨事件(而不是干旱事件)。要将其放入一系列单独的列中,可以使用spread()将其分布在具有模型名称的列下。我想在这种情况下,您需要单独的事件持续时间和降雨表