R- Сезонность - PullRequest
       8

R- Сезонность

0 голосов
/ 20 марта 2020

У меня есть фрейм данных, называемый «мадрид», в котором измеряются загрязнители воздуха, а также дата, год, месяц и день. Есть данные с 2001 по 2018 год

data.frame':    3808224 obs. of  15 variables:
 $ date   : Date, format: "2001-08-01" "2001-08-01" "2001-08-01" ...
 $ BEN    : num  NA 1.5 NA NA NA ...
 $ CO     : num  0.37 0.34 0.28 0.47 0.39 ...
 $ EBE    : num  NA 1.49 NA NA NA ...
 $ NMHC   : num  NA 0.07 NA NA NA ...
 $ NO_2   : num  58.4 56.2 50.7 69.8 22.8 ...
 $ O_3    : num  34.5 42.2 46.3 40.7 66.3 ...
 $ PM10   : num  105 100.6 100.1 69.8 75.2 ...
 $ SO_2   : num  6.34 8.11 7.85 6.46 8.8 ...
 $ TCH    : num  NA 1.24 NA NA NA ...
 $ TOL    : num  NA 10.8 NA NA NA ...
 $ station: int  28079001 28079035 28079003 28079004 28079039 28079006 28079007 28079009 28079038 28079011 ...
 $ year   : num  2001 2001 2001 2001 2001 ...
 $ month  : num  8 8 8 8 8 8 8 8 8 8 ...
 $ day    : int  1 1 1 1 1 1 1 1 1 1 ...

, и я сейчас пытаюсь создать график, который показывает среднемесячное общее значение каждого загрязнителя. Итак, в идеале одна линия / кривая с месяцами, нанесенными на ось X, чтобы увидеть, есть ли сезонность. До сих пор я делал это (ниже) с помощью dplyr:

madrid_season <- madrid %>%
  group_by(month, year) %>%
  summarise(BEN_mean = mean(BEN, na.rm = TRUE),
            CO_mean = mean(CO, na.rm = TRUE),
            EBE_mean = mean(EBE, na.rm = TRUE),
            NMHC_mean = mean(NMHC, na.rm = TRUE),
            NO_2_mean = mean(NO_2, na.rm = TRUE),
            O_3_mean = mean(O_3, na.rm = TRUE),
            PM10_mean = mean(PM10, na.rm = TRUE),
            SO_2_mean = mean(SO_2, na.rm = TRUE),
            TCH_mean = mean(TCH, na.rm = TRUE),
            TOL_mean = mean(TOL, na.rm = TRUE)) 

, а затем суммирую средние значения (исключая столбец месяца и года):

madrid_season$tot <- rowSums(madrid_season[,2:11], na.rm = TRUE)

, а затем я попробуйте построить график:

p4 <- ggplot(madrid_season, aes(x=month,y=tot))+geom_point()+geom_line()

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

Я думаю, что мне нужна помощь с использованием dplyr в этом случае (или открыт для других предложений!)

1 Ответ

1 голос
/ 20 марта 2020

Я бы не советовал суммировать каждое среднемесячное измерение. Измерение с самым большим масштабом, здесь это выглядит как PM 10 , затмит все другие измерения.

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

Я буду использовать набор данных mydata из пакета openair, поскольку вы не предоставили никаких данных. Переменные похожи на ваши.

library(openair)

str(mydata)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   65533 obs. of  10 variables:
 $ date: POSIXct, format: "1998-01-01 00:00:00" "1998-01-01 01:00:00" ...
 $ ws  : num  0.6 2.16 2.76 2.16 2.4 3 3 3 3.36 3.96 ...
 $ wd  : int  280 230 190 170 180 190 140 170 170 170 ...
 $ nox : int  285 NA NA 493 468 264 171 195 137 113 ...
 $ no2 : int  39 NA NA 52 78 42 38 51 42 39 ...
 $ o3  : int  1 NA 3 3 2 0 0 0 1 2 ...
 $ pm10: int  29 37 34 35 34 16 11 12 12 12 ...
 $ so2 : num  4.72 NA 6.83 7.66 8.07 ...
 $ co  : num  3.37 NA 9.6 10.22 8.91 ...
 $ pm25: int  NA NA NA NA NA NA NA NA NA NA ...

library(dplyr)
library(lubridate)
library(ggplot2)

mydata %>%
  mutate(Year=factor(year(date)), Month=month(date, label = TRUE)) %>%
    group_by(Year, Month) %>%
  summarise_all(list(mean=mean), na.rm=TRUE) %>%
  ggplot(aes(y=o3_mean, x=Month, group=Year, col=Year)) +
  geom_line(lwd=1) + ylab(expression(O[3]))

enter image description here

Итак, сезонность O 3 очевидно.

Если вы хотите построить все измерения, измените форму на длинную форму и добавьте фасет к измерению.

library(tidyr)
mydata %>%
  mutate(Year=factor(year(date)), Month=month(date, label = TRUE)) %>%
  group_by(Year, Month) %>%
  summarise_all(list(mean=mean), na.rm=TRUE) %>%
  select(-date_mean) %>%
  pivot_longer(cols=ends_with("_mean"), 
               names_to = c("measurement", ".value"), 
               names_sep="_") %>%
  ggplot(aes(y=mean, x=Month, group=Year, col=Year)) +
  geom_line() +
  facet_wrap(~measurement, scales="free") +
  scale_x_discrete(labels=function(x) substr(x, 1, 1))

enter image description here

...