Агрегирование ежедневных данных для выдачи одного предупреждения на основе многоуровневой системы предупреждений в нескольких местах. - PullRequest
1 голос
/ 28 октября 2019

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

Рассмотрим следующую настройку:

location = c(rep("A", 4), rep("B", 4), rep("C", 4), rep("D",4) , rep("E", 4))
date = rep(c("19991230", "19991231", "20000101", "20000102"), 5)
warning = c("Red", "None", "None", "None", "Yellow", "None", "Red", "None", "Yellow", "Yellow", "None", "Yellow", "None", "None", "None", "None", "Yellow", "None", "None", "None")

data = data.frame(location, date, warning)

Я пытаюсь создать новый столбец, который будет показывать «Нет», если в каждый конкретный день не было предупреждений, «Желтый», если один или несколькопоявляется предупреждение желтого цвета (кроме случаев, когда в тот же день появляется одно или несколько «красных» предупреждений), и в этом случае выход «Красный» имеет приоритет.

Я рассмотрел использование агрегирования по дате, но я не уверен, какую функцию применять,Я также пытался зацикливаться на каждой дате, чтобы попытаться сосчитать предупреждения «Нет», чтобы хотя бы сузить их, но безуспешно. Возможно, мне нужно использовать ifelse и цикл for для дат? Бедные попытки ниже:

aggregate(data, by=date, FUN)

или

data <- data %>%
group_by(date) %>%
mutate(day_warning_type = case_when(
warning != "None" ~ TRUE, TRUE ~ FALSE
)) %>%
ungroup()

Надеюсь, кто-то может, по крайней мере, помочь мне в правильном направлении, так как я не добился большого прогресса, насколько мне трудно узнатькак работать с символьными переменными.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вы были на правильном пути с group_by. Возможно, проще создать второй набор данных, который будет суммировать по дате, а затем объединить его с основным набором данных. Смотри ниже

# Summarize each date based on number of Yellow/Red/None warnings
data_sum <- data %>%
  group_by(date) %>%
  summarize(
    day_warning_none = length(which(warning == "None")),
    day_warning_yellow = length(which(warning == "Yellow")),
    day_warning_red = length(which(warning == "Red"))
  ) %>%
  ungroup() %>%
  # Create a summary  measure
  mutate(
    day_warning = case_when(
      day_warning_red > 0 ~ "Red",
      day_warning_yellow > 0 ~ "Yellow",
      TRUE ~ "None"
    )
  )

head(data.sum)
  date     day_warning_none day_warning_yellow day_warning_red day_warning
  <fct>               <int>              <int>           <int> <chr>      
1 19991230                1                  3               1 Red        
2 19991231                4                  1               0 Yellow     
3 20000101                4                  0               1 Red        
4 20000102                4                  1               0 Yellow    

# Merge back in
data2 <- left_join(data, data_sum) %>%
  arrange(date)
head(data2, 10)

   location     date warning day_warning_none day_warning_yellow day_warning_red day_warning
1         A 19991230     Red                1                  3               1         Red
2         B 19991230  Yellow                1                  3               1         Red
3         C 19991230  Yellow                1                  3               1         Red
4         D 19991230    None                1                  3               1         Red
5         E 19991230  Yellow                1                  3               1         Red
6         A 19991231    None                4                  1               0      Yellow
7         B 19991231    None                4                  1               0      Yellow
8         C 19991231  Yellow                4                  1               0      Yellow
9         D 19991231    None                4                  1               0      Yellow
10        E 19991231    None                4                  1               0      Yellow
0 голосов
/ 28 октября 2019

Вы можете создать счетчик предупреждений и создать флаг на основе счетчиков:

data %>% 
  group_by(date) %>% 
  mutate(day_warning_type = case_when(
    sum(warning == "Red") > 0 ~ "Red",
    sum(warning == "Red") == 0 & sum(warning == "Yellow") > 0 ~ "Yellow",
    TRUE ~ "None"
  )) %>% 
  ungroup()

# A tibble: 20 x 4
   location date     warning day_warning_type
   <fct>    <fct>    <fct>   <chr>           
 1 A        19991230 Red     Red             
 2 A        19991231 None    Yellow          
 3 A        20000101 None    Red             
 4 A        20000102 None    Yellow          
 5 B        19991230 Yellow  Red             
 6 B        19991231 None    Yellow          
 7 B        20000101 Red     Red             
 8 B        20000102 None    Yellow          
 9 C        19991230 Yellow  Red             
10 C        19991231 Yellow  Yellow          
11 C        20000101 None    Red             
12 C        20000102 Yellow  Yellow          
13 D        19991230 None    Red             
14 D        19991231 None    Yellow          
15 D        20000101 None    Red             
16 D        20000102 None    Yellow          
17 E        19991230 Yellow  Red             
18 E        19991231 None    Yellow          
19 E        20000101 None    Red             
20 E        20000102 None    Yellow 
...