Как можно суммировать и подсчитывать данные нескольких столбцов, окруженные нулями - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю с наборами данных о климатических осадках, и мне необходимо определить продолжительность (сколько последовательных дней) события выпадения осадков, а затем суммировать эти события путем суммирования общего количества выпавших осадков.Мой текущий набор данных выглядит следующим образом:

> 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 Ответ

1 голос
/ 26 сентября 2019

Один из способов справиться с этим - создать столбец для определения количества осадков, а затем суммировать на основе этого столбца.

решение по тидиверсу:

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(), чтобы распределить их по столбцам с названием модели.Я думаю, что в этом случае вам нужны отдельные таблицы для продолжительности события и количества осадков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...