Ищем код R для суммирования переменной по строкам на основе диапазона возможных значений, содержащихся в одной строке

Я работаю с простым набором данных. Он содержит три представляющих интерес переменных. 1. Дата ГГГГ-ММ-ДД 2. Почасовая (##) 3. Precip_H (#. ##).

Моя ситуация заключается в том, что я пытаюсь найти код, который, например, суммирует значения gap_H по строкам, которые равны определенной DATE и находятся в пределах 00-11 для значения Hourly. Затем следующий набор будет делать все то же самое, но для диапазона 12–23 в час.

Этот набор данных представляет собой метеостанцию, которая ежечасно сообщает об осадках. Что я пытаюсь сделать, так это использовать эту информацию для получения двух 12-часовых значений осадков в день для всех дней набора данных.

   DATE       TIME  PRECIP_H DATEyyyy DATEmm DATEdd
   <date>     <chr>    <dbl>    <dbl>  <dbl>  <dbl>
 1 2019-06-05 17           0     2019      6      5
 2 2019-06-01 20           0     2019      6      1
 3 2019-06-06 19           0     2019      6      6
 4 2019-05-27 00           0     2019      5     27
 5 2019-08-25 20           0     2019      8     25
 6 2019-08-08 04           0     2019      8      8
 7 2019-09-01 07           0     2019      9      1
 8 2019-07-18 21           0     2019      7     18
 9 2019-06-18 23           0     2019      6     18
10 2019-08-11 12           0     2019      8     11

library(readxl)
precip2019 <- Clean_Chicago_Midway_Precp_Hourly_2019_1945790 <- read_excel("S:/Natural Resources/Staff/Beach Management/Beaches Main/+ DATA ANALYSIS +/Beaches 2019/Master Files/Clean_Chicago Midway Precp Hourly 2019_1945790.xlsx")


names(precip2019)[names(precip2019) == "HourlyPrecipitation"] <- "PRECIP_H"


precip2019$DATE <- as.Date(precip2019$DATE, format = '%Y-%m-%d')
precip2019$DATEyyyy <- as.numeric(format(precip2019$DATE, '%Y'))
precip2019$DATEmm <- as.numeric(format(precip2019$DATE, '%m'))
precip2019$DATEdd <- as.numeric(format(precip2019$DATE, '%d'))

prec_sum <- precip2019 %>% 
  select(DATE, TIME, starts_with("PREC")) %>% 
  mutate(Period = case_when(between(TIME, 0, 11) ~ "1st_half",
                            TRUE ~ "2nd_half")) %>% 
  group_by(DATE, Period) %>% 
  summarise_at(vars(starts_with("PREC")), list(~ sum(., na.rm = TRUE))) %>% 
  ungroup()
View(prec_sum) 

person Kendall A    schedule 15.11.2019    source источник
comment
Добро пожаловать в SO! Прочтите это и постарайтесь воспроизвести вашу проблему, чтобы другие могли помочь stackoverflow.com/questions/5963269/   -  person Tung    schedule 15.11.2019


Ответы (1)


Это может сработать в вашем случае. Сначала нам нужно создать столбец Period на основе временного диапазона (case_when). Затем произведите суммирование на основе группы из двух столбцов DATE и Period (summarise_at).

library(dplyr)

prec_sum <- prec_data %>% 
  select(DATE, TIME, starts_with("PREC")) %>% 
  mutate(TIME = as.numeric(TIME)) %>% 
  mutate(Period = case_when(between(TIME, 0, 11) ~ "1st_half",
                            TRUE ~ "2nd_half")) %>% 
  group_by(DATE, Period) %>% 
  summarise_at(vars(starts_with("PREC")), list(~ sum(., na.rm = TRUE))) %>% 
  ungroup()
person Tung    schedule 15.11.2019
comment
Я получаю сообщение об ошибке: Ошибка: несовместимо с запрошенным типом: [type = character; target = double]. Я только изменил, чтобы включить имя набора данных: prec_sum ‹- diver2019%›% select (DATE, TIME, start_with (PREC))% ›% mutate (Period = case_when (between (TIME, 0, 11) ~ 1st_half, TRUE ~ 2nd_half))% ›% group_by (DATE, Period)%›% summarise_at (vars (start_with (PREC)), list (~ sum (., Na.rm = TRUE)))% ›% ungroup () - person Kendall A; 15.11.2019
comment
Пожалуйста, опубликуйте образец вашего набора данных в соответствии с инструкциями по ссылке, которую я разместил. Невозможно узнать, почему произошла ошибка, не просматривая данные - person Tung; 15.11.2019
comment
Посмотри сейчас - person Kendall A; 15.11.2019
comment
Лучше, но еще не воспроизводимо. См. Этот пример stackoverflow.com/q/56811184/786542. Убедитесь, что другие могут скопировать и вставить код, а затем запустить его на другом компьютере. - person Tung; 15.11.2019