如何汇总和计算用零括起来的多列数据

  • 本文关键字:起来 数据 何汇总 计算 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 列数据(每列都是不同的气候模型(。对于每个模型,我想生成一个新列,其中包含降雨事件持续时间的计数值和同一降雨事件降雨总和的列。任何帮助将不胜感激,谢谢。

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

整洁的解决方案:

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()将它们分布在具有模型名称的列下。 我认为在这种情况下,您需要单独的事件持续时间和降雨量表

相关内容

最新更新