Условная разность двух строк на основе двух разных групп в R - PullRequest
1 голос
/ 25 января 2020

Следующий набор данных содержит почасово накопленное количество осадков. Я хочу рассчитать почасовую норму осадков, рассчитав разницу осадков в течение двух часов подряд.

Проблема в том, что измерение осадков начинается каждый день в 09:00. Поэтому я хочу начать находить разницу между двумя последовательными строками столбца hr_rain с 09 часа, скажем, 06/02/18, до 08 часа с 06/03/18 и снова такой же для следующего дня .

Я не могу просто начать с 09 часов и go для следующих 24 записей, так как в течение некоторых дней некоторые наблюдения для hr_rain отсутствуют.
Примеры данных следующие:

 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  1.0
SHIVAMOGGA  163 06/09/18    06  1.5
SHIVAMOGGA  163 06/09/18    07  2.5
SHIVAMOGGA  163 06/09/18    08  2.5
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  0.5
SHIVAMOGGA  163 06/09/18    13  0.5
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/18    03  0.5
SHIVAMOGGA  163 06/10/18    05  0.5
SHIVAMOGGA  163 06/10/18    06  0.5
SHIVAMOGGA  163 06/10/18    07  0.5
SHIVAMOGGA  163 06/10/18    08  0.5
SHIVAMOGGA  163 06/10/18    09  0.0
SHIVAMOGGA  163 06/10/18    10  0.0

Я пытался с

df %>%  group_by(DATE) %>% mutate( RAINFALL = hr_rain - lag(hr_rain, default = 0))

, но он группирует в соответствии с DATE и дает результаты с 0 часов дня до 23 часов дня и начинает заново для следующего дня. Но я хочу начать с 09 часов каждый день до 8 часов следующего дня. То, что я хочу:

STATION    CODE  DATE     HOUR hr_rain rainfall

SHIVAMOGGA  163 06/09/18    00  1.0    1
SHIVAMOGGA  163 06/09/18    04  1.0    0 
SHIVAMOGGA  163 06/09/18    05  1.0    0
SHIVAMOGGA  163 06/09/18    06  1.5    0.5 
SHIVAMOGGA  163 06/09/18    07  2.5    1 
SHIVAMOGGA  163 06/09/18    08  2.5    0
SHIVAMOGGA  163 06/09/18    09  0.0    0
SHIVAMOGGA  163 06/09/18    10  0.5    0.5 
SHIVAMOGGA  163 06/09/18    11  0.5    0
SHIVAMOGGA  163 06/09/18    12  0.5    0
SHIVAMOGGA  163 06/09/18    13  0.5    0
SHIVAMOGGA  163 06/09/18    14  0.5    0
SHIVAMOGGA  163 06/09/18    15  0.5    0
SHIVAMOGGA  163 06/09/18    16  0.5    0
SHIVAMOGGA  163 06/09/18    17  0.5    0
SHIVAMOGGA  163 06/09/18    18  0.5    0
SHIVAMOGGA  163 06/09/18    19  0.5    0
SHIVAMOGGA  163 06/10/18    03  0.5    0
SHIVAMOGGA  163 06/10/18    05  0.5    0
SHIVAMOGGA  163 06/10/18    06  0.5    0
SHIVAMOGGA  163 06/10/18    07  0.5    0
SHIVAMOGGA  163 06/10/18    08  0.5    0
SHIVAMOGGA  163 06/10/18    09  0.0    0
SHIVAMOGGA  163 06/10/18    10  0.0    0

Как новичок в R, я действительно мог бы упустить что-то простое. Буду признателен за любые идеи, как это сделать в R.

1 Ответ

3 голосов
/ 25 января 2020

Вам необходимо создать группы, когда HOUR == 9

library(dplyr)

df %>%
  group_by(gr = cumsum(HOUR == 9)) %>%
  #Maybe you'll also need to add more groups
  #group_by(STATION, CODE, gr = cumsum(HOUR == 9)) %>%
  mutate(RAINFALL = hr_rain - lag(hr_rain, default = 0))

#  STATION     CODE DATE      HOUR hr_rain RAINFALL
#   <fct>      <int> <fct>    <int>   <dbl>    <dbl>
# 1 SHIVAMOGGA   163 06/09/18     0     1        1  
# 2 SHIVAMOGGA   163 06/09/18     4     1        0  
# 3 SHIVAMOGGA   163 06/09/18     5     1        0  
# 4 SHIVAMOGGA   163 06/09/18     6     1.5      0.5
# 5 SHIVAMOGGA   163 06/09/18     7     2.5      1  
# 6 SHIVAMOGGA   163 06/09/18     8     2.5      0  
# 7 SHIVAMOGGA   163 06/09/18     9     0        0  
# 8 SHIVAMOGGA   163 06/09/18    10     0.5      0.5
# 9 SHIVAMOGGA   163 06/09/18    11     0.5      0  
#10 SHIVAMOGGA   163 06/09/18    12     0.5      0  
# … with 14 more rows

data

df <- structure(list(STATION = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "SHIVAMOGGA", class = "factor"), CODE = c(163L, 
163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 
163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 163L, 
163L), DATE = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("06/09/18", 
"06/10/18"), class = "factor"), HOUR = c(0L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 3L, 
5L, 6L, 7L, 8L, 9L, 10L), hr_rain = c(1, 1, 1, 1.5, 2.5, 2.5, 
0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 
0.5, 0.5, 0.5, 0, 0)), class = "data.frame", row.names = c(NA, -24L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...