Отображение ежедневных данных в квартал / год - PullRequest
0 голосов
/ 19 сентября 2019

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

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

Код, который я использовал для составления графика использования с течением времени, выглядит следующим образом;

data001 <- read.csv("001.csv")
date001 <- as.Date(data001$Date, "%d/%m/%Y")

ggplot(data001, aes(date001, Antibiotic.Total)) + geom_bar(stat = "identity", colour = "steelblue3") + scale_x_date(date_breaks = "3 months", date_labels = "%m/%y") + ylab("Antibiotic Total (Grams)")

Пример того, с чем я работаю, здесь;

1   13/04/2013  5.000
2   13/04/2013  0.000
3   10/05/2013  7.200
4   22/05/2013  5.000
5   22/05/2013  5.000
6   17/06/2013  7.200
7   17/06/2013  5.000
8   29/06/2013  5.000
9   29/06/2013  7.200
10  29/06/2013  2.250
11  05/08/2013  0.000
12  05/08/2013  5.000
13  24/09/2013  0.500
14  01/10/2013  7.200
15  04/10/2013  4.000
16  08/10/2013  0.500
17  11/10/2013  10.000
18  22/10/2013  0.500
19  29/10/2013  7.200
20  29/10/2013  5.000

Хотелось бы иметь столбчатую диаграмму с каждым столбцом, показывающим общее количество антибиотика, использованного за каждый квартал за 6 лет данных, которые у меня есть :)

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Вот способ, которым вы можете сделать это, см. Комментарии в коде:

library(zoo) #install the package if needed, provide the function as.yearqtr

#Load the data, these are the example data you gave,

data=structure(list(V1 = structure(c(7L, 7L, 5L, 9L, 9L, 8L, 8L, 12L, 
12L, 12L, 3L, 3L, 11L, 1L, 2L, 4L, 6L, 10L, 13L, 13L),.Label = c("01/10/2013", "04/10/2013", "05/08/2013", "08/10/2013", "10/05/2013", "11/10/2013", 
"13/04/2013", "17/06/2013", "22/05/2013", "22/10/2013", "24/09/2013", 
"29/06/2013", "29/10/2013"), class = "factor"),
V2 = c(5, 0, 7.2, 5, 5, 7.2, 5, 5, 7.2, 2.25, 0, 5, 0.5, 7.2, 4, 0.5, 10, 0.5, 7.2, 5)),class = "data.frame", row.names = c(NA, -20L))

#Set column name
colnames(data)=c("date","antibiotic")

#Add a column containing the year and quarter
data$quarter=as.yearqtr(data$date, format = "%d/%m/%Y")

#Looks like:
head(data)
#        date antibiotic quarter
#1 13/04/2013        5.0 2013 Q2
#2 13/04/2013        0.0 2013 Q2
#3 10/05/2013        7.2 2013 Q2
#4 22/05/2013        5.0 2013 Q2
#5 22/05/2013        5.0 2013 Q2
#6 17/06/2013        7.2 2013 Q2

#Now sum data for each quarter (if you ant the mean use it in the FUN argement
aggregated_data=aggregate(data$antibiotic,by=list(data$quarter),FUN=sum)

#And now you have a nice output per quarter:
head(aggregated_data)
#  Group.1     x
#1 2013 Q2 48.85
#2 2013 Q3  5.50
#3 2013 Q4 34.40

Теперь вы можете использовать aggregated_data для вашего барплота

0 голосов
/ 19 сентября 2019

Вы можете использовать tidyverse для суммирования общего количества антибиотиков за квартал, а затем построить график.

library(tidyverse)
data001 %>%
  mutate(Q = lubridate::quarter(date001, with_year = T)) %>% # Add a column with the quarter
  group_by(Q) %>% # group by that column
  summarize(Antibiotic_by_Q = sum(Antibiotic.Total)) %>% # summarize by quarter by taking the mean
  ggplot(aes(Q, Antibiotic_by_Q)) + geom_bar(stat = "identity", fill = "steelblue3") + ylab("Antibiotic Total (Grams)") # Graph by the new variables, x is no longer a date so remove scale_x_date
0 голосов
/ 19 сентября 2019

Добавьте в свой ggplot следующее:

scale_x_date(date_breaks = "years")

это увеличит масштаб оси X до нескольких лет, делая ее более читабельной.

Если вы имели в виду, что выЕсли вы хотите «агрегировать» данные в квартальные / годовые суммы, вы могли бы сделать что-то вроде этого:

library('dplyr') # for piping, group_by, etc.
library('lubridate') # for working with dates
data %>%
  mutate(Year = year(date) %>% # generates a new column with the Year
  group_by(Year) %>%
  summarise(antibiotic=sum(antibiotic, na.rm = TRUE) %>% # aggregates the values over a year
  ggplot(aes(Year,Value)) + geom_bar(stat = "identity", colour = "steelblue3") + 
 ylab("Antibiotic Total (Grams)")

Вот также решение для квартальных данных, основанное на пакете zoo, как упомянуто Chelmy88, но с dplyr:

data=structure(list(date = structure(c(7L, 7L, 5L, 9L, 9L, 8L, 8L, 12L, 
12L, 12L, 3L, 3L, 11L, 1L, 2L, 4L, 6L, 10L, 13L, 13L),.Label = c("01/10/2013", "04/10/2013", "05/08/2013", "08/10/2013", "10/05/2013", "11/10/2013", 
"13/04/2013", "17/06/2013", "22/05/2013", "22/10/2013", "24/09/2013", 
"29/06/2013", "29/10/2013"), class = "factor"),
antibiotic = c(5, 0, 7.2, 5, 5, 7.2, 5, 5, 7.2, 2.25, 0, 5, 0.5, 7.2, 4, 0.5, 10, 0.5, 7.2, 5)),class = "data.frame", row.names = c(NA, -20L))

library(dplyr) # for piping, group_by, etc.
library(zoo) # for working with dates
data %>%
  mutate(quarter = as.yearqtr(as.character(date), format = "%d/%m/%Y")) %>% # generates a new column with the Year
  group_by(quarter) %>%
  summarise(antibiotic=sum(antibiotic, na.rm = TRUE)) %>% # aggregates the values over a year
  ggplot(aes(quarter,antibiotic)) + geom_bar(stat = "identity", colour = "steelblue3") + 
 ylab("Antibiotic Total (Grams)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...