我正在使用气候降水数据集,需要确定一次降水事件的持续时间(连续几天),然后通过对一个事件的总降雨量求和来总结这些事件。我当前的数据集如下:
> 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列数据(每个气候模型均不同)。对于每个模型,我想生成一个新列,其中包含降雨事件持续时间的计数值,以及一个列,用于同一降雨事件的降雨总和。任何帮助将不胜感激,谢谢。
答案 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()
将其分布在具有模型名称的列下。我想在这种情况下,您需要单独的事件持续时间和降雨表