r - Рассчитать% в подгруппе, используя Dplyr - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу нанести на график относительное число смертельных исходов по годам для каждого из различных типов событий.

Я могу работать с фасетами в ggplot, но изо всех сил пытаюсь рассчитать% By Event на основе событий, года ибез потерь.

Event Type Year  Fatalities  % by Event 
                             (calculated)
-----      ----  ----------  ---------- 
Storm      1980           5  12.5%
Storm      1981           9  22.5%
Storm      1982          15  37.5%
Storm      1983          11  27.5%
Ice        1980           7  70%
Ice        1981           3  30%

У меня есть следующий код для его расчета, но расчет не работает с%, используя гораздо больший знаменатель.

fatalitiesByYearType <- stormDF %>% 
    group_by(eventType) %>% 
    mutate(totalEventFatalities = sum(FATALITIES)) %>%
    group_by(year, add = TRUE) %>% 
    mutate(fatalitiesPct =  sum(FATALITIES) / totalEventFatalities)

Что я делаюнеправильно?

Мой график ниже.Я включаю это на всякий случай, так как мне также интересно посмотреть, есть ли способ пропорционального отображения данных в ggplot.

p <- ggplot(data = fatalitiesByYearType,
    aes(x=factor(year),y=fatalitiesPct)) 
p + geom_bar(stat="identity") +
    facet_wrap(.~eventType, nrow = 5) +
    labs(x = "Year", 
         y = "Fatalities",
         title = "Fatalities by Type")

1 Ответ

0 голосов
/ 24 декабря 2018

Может быть, я не понимаю вашу проблему, но мы можем начать отсюда:

library(dplyr)
library(ggplot2)

# here the dplyr part
  dats <- fatalitiesByYearType %>%
          group_by(eventType) %>% 
          mutate(totalEventFatalities = sum(FATALITIES)) %>%
          group_by(year, add = TRUE) %>% 
          # here we add the summarise
          summarise(fatalitiesPct =  sum(FATALITIES) / totalEventFatalities)     
     dats
# A tibble: 6 x 3
# Groups:   eventType [?]
  eventType  year fatalitiesPct
  <fct>     <int>         <dbl>
1 Ice        1980         0.7  
2 Ice        1981         0.3  
3 Storm      1980         0.125
4 Storm      1981         0.225
5 Storm      1982         0.375
6 Storm      1983         0.275

Вы можете четко объединить все в уникальную цепочку dplyr:

# here the ggplot2 part     
    p <- ggplot(dats,aes(x=factor(year),y=fatalitiesPct)) + 
         geom_bar(stat="identity") +
         facet_wrap(.~eventType, nrow = 5) +
         labs(x = "Year", y = "Fatalities", title = "Fatalities by Type") +
         # here we add the % in the plot
         scale_y_continuous(labels = scales::percent)  

enter image description here


С данными:

fatalitiesByYearType <- read.table(text = "eventType year  FATALITIES  
                                   Storm      1980           5  
                                   Storm      1981           9  
                                   Storm      1982          15  
                                   Storm      1983          11  
                                   Ice        1980           7  
                                   Ice        1981           3  ",header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...