функция group_by не работает с другим group_by - PullRequest
0 голосов
/ 30 января 2020

У меня есть данные, заданные в следующем формате:

STATION     CODE  DATE     HOUR hr_rain
SHIVAMOGGA  163 06/09/18    00   1.0
SHIVAMOGGA  163 06/09/18    04   1.0
SHIVAMOGGA  163 06/09/18    05   NA
SHIVAMOGGA  163 06/09/18    06   1.5
SHIVAMOGGA  163 06/09/18    07   2.5
SHIVAMOGGA  163 06/09/18    08   NA
SHIVAMOGGA  163 06/09/18    09   0.0
SHIVAMOGGA  163 06/09/18    10   0.5
SHIVAMOGGA  163 06/09/18    11   0.5
SHIVAMOGGA  163 06/09/18    12   NA
SHIVAMOGGA  163 06/09/18    13   NA
SHIVAMOGGA  163 06/09/18    14   0.5
SHIVAMOGGA  163 06/09/18    15   0.5
SHIVAMOGGA  163 06/09/18    16   0.5
SHIVAMOGGA  163 06/09/18    17   0.5
SHIVAMOGGA  163 06/09/18    18   0.5
SHIVAMOGGA  163 06/09/18    19   0.5
SHIVAMOGGA  163 06/10/19    03   0.5
SHIVAMOGGA  163 06/10/19    05   NA
SHIVAMOGGA  163 06/10/19    06   NA
SHIVAMOGGA  163 06/10/19    07   NA
SHIVAMOGGA  163 06/10/19    08   0.5
SHIVAMOGGA  163 06/10/19    09   0.0
SHIVAMOGGA  163 06/10/19    10   0.0

Здесь параметр осадков представлен в почасовом накопленном формате. Меня интересует почасовая норма осадков. Измерение начинается каждый день в 09 ЧАС, а иногда наблюдения отсутствуют, поэтому я попытался заполнить значения NA (3 или более последовательных NA будут оставлены без изменений, а последовательные NA, число которых меньше 2, заменены, а NA в 8 HO выдало предыдущее значение ), сгруппировав для 09 ЧАС.

df1 <- df %>% 
  group_by(STATION, CODE, gr = cumsum(HOUR == '09')) %>% 
  mutate(hr_rain = na.approx(hr_Rain, rule = 2, maxgap = 2, na.rm = FALSE))

Снова, чтобы рассчитать почасовую интенсивность осадков, я попытался сгруппировать df1 с:

hourly_df <- df1 %>% 
  group_by(STATION, CODE , grp = cumsum(HOUR == '09')) %>% 
  mutate(RAINFALL = hr_rain - lag(hr_rain, default = 0))

Но это не работает. Создается первая группа, а затем вторая группа продолжается до конца кадра данных. Результат будет выглядеть примерно так:

STATION     CODE  DATE     HOUR hr_rain  NUM_NA  gp  grp  RAINFALL
SHIVAMOGGA  163 06/09/18    00   1.0       2      0   0     1
SHIVAMOGGA  163 06/09/18    04   1.0       2      0   0     0
SHIVAMOGGA  163 06/09/18    05   1.25      1      0   0     0.25
SHIVAMOGGA  163 06/09/18    06   1.5       1      0   0     0.25
SHIVAMOGGA  163 06/09/18    07   2.5       1      0   0     1
SHIVAMOGGA  163 06/09/18    08   2.5       1      0   0     0
SHIVAMOGGA  163 06/09/18    09   0.0       1      1   1     -2.5
SHIVAMOGGA  163 06/09/18    10   0.5       2      1   1     0.5
SHIVAMOGGA  163 06/09/18    11   0.5       2      1   1     0
SHIVAMOGGA  163 06/09/18    12   0.5       2      1   1     0
SHIVAMOGGA  163 06/09/18    13   0.5       2      1   1     0
SHIVAMOGGA  163 06/09/18    14   0.5       7      1   1     0
SHIVAMOGGA  163 06/09/18    15   0.5       7      1   1     0
SHIVAMOGGA  163 06/09/18    16   0.5       7      1   1     0
SHIVAMOGGA  163 06/09/18    17   0.5       7      1   1     0
SHIVAMOGGA  163 06/09/18    18   0.5       7      1   1     0
SHIVAMOGGA  163 06/09/18    19   0.5       7      1   1     0
SHIVAMOGGA  163 06/10/19    03   0.5       7      1   1     0
SHIVAMOGGA  163 06/10/19    05   NA        3      1   1     NA
SHIVAMOGGA  163 06/10/19    06   NA        3      1   1     NA
SHIVAMOGGA  163 06/10/19    07   NA        3      1   1     NA
SHIVAMOGGA  163 06/10/19    08   0.5       1      1   1     0.5
SHIVAMOGGA  163 06/10/19    09   0.0       2      2   1     -0.5
SHIVAMOGGA  163 06/10/19    10   0.0       2      2   1     0

При этом за 9 ЧАСОВ я получаю отрицательные значения, которые я хочу начать со значения hr_rain (поэтому я пытался создать еще одну группировку по 09 ЧАСОВ) для этого поля. Заранее спасибо за любую помощь!

1 Ответ

1 голос
/ 30 января 2020

Поскольку обе группы одинаковы, нет необходимости рассчитывать их по-разному, вы можете объединить их и вычислить hr_rain и RAINFALL вместе.

library(dplyr)

df %>% 
  group_by(STATION, CODE, gr = cumsum(HOUR == '09')) %>% 
  mutate(hr_rain = zoo::na.approx(hr_rain, rule = 2, maxgap = 2, na.rm = FALSE), 
         RAINFALL = hr_rain - lag(hr_rain, default = 0)) 

данные

df <- structure(list(STATION = c("SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", 
"SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", 
"SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", 
"SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", 
"SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", "SHIVAMOGGA", 
"SHIVAMOGGA"), CODE = c(163, 163, 163, 163, 163, 163, 163, 163, 
163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 
163, 163, 163), DATE = c("06/09/18", "06/09/18", "06/09/18", 
"06/09/18", "06/09/18", "06/09/18", "06/09/18", "06/09/18", "06/09/18", 
"06/09/18", "06/09/18", "06/09/18", "06/09/18", "06/09/18", "06/09/18", 
"06/09/18", "06/09/18", "06/10/19", "06/10/19", "06/10/19", "06/10/19", 
"06/10/19", "06/10/19", "06/10/19"), HOUR = c("00", "04", "05", 
"06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "03", "05", "06", "07", "08", "09", "10"), 
hr_rain = c(1, 1, NA, 1.5, 2.5, NA, 0, 0.5, 0.5, NA, NA, 
0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, NA, NA, NA, 0.5, 0, 0)), row.names = c(NA, 
-24L), class = "data.frame")
...