-
Ben Anderson authoredBen Anderson authored
cleaningFeederData.tex 37.11 KiB
\PassOptionsToPackage{unicode=true}{hyperref} % options for packages loaded elsewhere
\PassOptionsToPackage{hyphens}{url}
%
\documentclass[]{article}
\usepackage{lmodern}
\usepackage{amssymb,amsmath}
\usepackage{ifxetex,ifluatex}
\usepackage{fixltx2e} % provides \textsubscript
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % provides euro and other symbols
\else % if luatex or xelatex
\usepackage{unicode-math}
\defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
\fi
% use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
% use microtype if available
\IfFileExists{microtype.sty}{%
\usepackage[]{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\IfFileExists{parskip.sty}{%
\usepackage{parskip}
}{% else
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
}
\usepackage{hyperref}
\hypersetup{
pdftitle={Cleaning Feeder Data},
pdfauthor={Ben Anderson (b.anderson@soton.ac.uk), SERG, Energy \& Climate Change, University of Southampton},
pdfborder={0 0 0},
breaklinks=true}
\urlstyle{same} % don't use monospace font for urls
\usepackage[margin=1in]{geometry}
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\usepackage{framed}
\definecolor{shadecolor}{RGB}{248,248,248}
\newenvironment{Shaded}{\begin{snugshade}}{\end{snugshade}}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{0.94,0.16,0.16}{#1}}
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}}
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.77,0.63,0.00}{#1}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}}
\newcommand{\BuiltInTok}[1]{#1}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}}
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}}
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}}
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{#1}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}}
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{0.64,0.00,0.00}{\textbf{#1}}}
\newcommand{\ExtensionTok}[1]{#1}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}}
\newcommand{\ImportTok}[1]{#1}
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}}
\newcommand{\NormalTok}[1]{#1}
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.81,0.36,0.00}{\textbf{#1}}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{#1}}
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}}
\newcommand{\RegionMarkerTok}[1]{#1}
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}}
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}}
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}}
\usepackage{longtable,booktabs}
% Fix footnotes in tables (requires footnote package)
\IfFileExists{footnote.sty}{\usepackage{footnote}\makesavenoteenv{longtable}}{}
\usepackage{graphicx,grffile}
\makeatletter
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
\makeatother
% Scale images if necessary, so that they will not overflow the page
% margins by default, and it is still possible to overwrite the defaults
% using explicit options in \includegraphics[width, height, ...]{}
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
\setlength{\emergencystretch}{3em} % prevent overfull lines
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setcounter{secnumdepth}{5}
% Redefines (sub)paragraphs to behave more like sections
\ifx\paragraph\undefined\else
\let\oldparagraph\paragraph
\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
\fi
\ifx\subparagraph\undefined\else
\let\oldsubparagraph\subparagraph
\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
\fi
% set default figure placement to htbp
\makeatletter
\def\fps@figure{htbp}
\makeatother
\usepackage{etoolbox}
\makeatletter
\providecommand{\subtitle}[1]{% add subtitle to \maketitle
\apptocmd{\@title}{\par {\large #1 \par}}{}{}
}
\makeatother
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{array}
\usepackage{multirow}
\usepackage{wrapfig}
\usepackage{float}
\usepackage{colortbl}
\usepackage{pdflscape}
\usepackage{tabu}
\usepackage{threeparttable}
\usepackage{threeparttablex}
\usepackage[normalem]{ulem}
\usepackage{makecell}
\usepackage{xcolor}
\title{Cleaning Feeder Data}
\providecommand{\subtitle}[1]{}
\subtitle{Code and notes}
\author{Ben Anderson (\href{mailto:b.anderson@soton.ac.uk}{\nolinkurl{b.anderson@soton.ac.uk}}), \href{http://www.energy.soton.ac.uk/}{SERG, Energy \& Climate Change}, University of Southampton}
\date{Last run at: 2020-07-07 17:25:30}
\begin{document}
\maketitle
{
\setcounter{tocdepth}{2}
\tableofcontents
}
\hypertarget{intro}{%
\section{Intro}\label{intro}}
We have some feeder data. There seem to be NAs and missing time stamps. We want to select the `best' (i.e most complete) days within a day-of-the-week/season/year sampling frame.
\hypertarget{data-prep}{%
\section{Data prep}\label{data-prep}}
\hypertarget{load-data}{%
\subsection{Load data}\label{load-data}}
Loading from \textasciitilde{}/Dropbox/Ben\_IOW\_SS.csv\ldots{}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{dt<-}\StringTok{ }\NormalTok{data.table}\OperatorTok{::}\KeywordTok{fread}\NormalTok{(dFile)}
\NormalTok{dt[, V1 }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\OtherTok{NULL}\NormalTok{] }\CommentTok{#drop}
\KeywordTok{head}\NormalTok{(dt)}
\end{Highlighting}
\end{Shaded}
\begin{verbatim}
## DateTime Value region sub_region Date Time Year Month
## 1: 2017-01-01T00:30:00Z 99 BINS C1T0 2017-01-01 00:30:00 2017 1
## 2: 2017-01-01T01:00:00Z 91 BINS C1T0 2017-01-01 01:00:00 2017 1
## 3: 2017-01-01T01:45:00Z 84 BINS C1T0 2017-01-01 01:45:00 2017 1
## 4: 2017-01-01T02:15:00Z 77 BINS C1T0 2017-01-01 02:15:00 2017 1
## 5: 2017-01-01T02:45:00Z 69 BINS C1T0 2017-01-01 02:45:00 2017 1
## 6: 2017-01-01T05:45:00Z 77 BINS C1T0 2017-01-01 05:45:00 2017 1
## Day Hour
## 1: 1 0
## 2: 1 1
## 3: 1 1
## 4: 1 2
## 5: 1 2
## 6: 1 5
\end{verbatim}
Do some data prep
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{dt[, rDateTime }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{lubridate}\OperatorTok{::}\KeywordTok{as_datetime}\NormalTok{(DateTime)]}
\NormalTok{dt[, rTime }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{hms}\OperatorTok{::}\KeywordTok{as_hms}\NormalTok{(rDateTime)]}
\NormalTok{dt[, rDate }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\KeywordTok{as.Date}\NormalTok{(rDateTime)]}
\NormalTok{dt[, rYear }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{lubridate}\OperatorTok{::}\KeywordTok{year}\NormalTok{(rDate)]}
\NormalTok{dt[, rDoW }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{lubridate}\OperatorTok{::}\KeywordTok{wday}\NormalTok{(rDate, }\DataTypeTok{label =} \OtherTok{TRUE}\NormalTok{)]}
\NormalTok{dt[, kW }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{Value] }\CommentTok{# for clarity}
\NormalTok{dt[, Value }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\OtherTok{NULL}\NormalTok{] }\CommentTok{#drop}
\NormalTok{dt <-}\StringTok{ }\KeywordTok{addSeason}\NormalTok{(dt, }\DataTypeTok{dateVar =} \StringTok{"rDate"}\NormalTok{, }\DataTypeTok{h =} \StringTok{"N"}\NormalTok{)}
\CommentTok{#skimr::skim(dt) doesn't play nicely with latex}
\NormalTok{st <-}\StringTok{ }\KeywordTok{summary}\NormalTok{(dt[,.(rYear, rDateTime, sub_region, kW, rDoW, season)])}
\NormalTok{kableExtra}\OperatorTok{::}\KeywordTok{kable}\NormalTok{(st,}
\DataTypeTok{caption =} \StringTok{"Summary of loaded and processed data"}\NormalTok{) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{kable_styling}\NormalTok{()}
\end{Highlighting}
\end{Shaded}
\begin{table}
\caption{\label{tab:dataSummary}Summary of loaded and processed data}
\centering
\begin{tabular}[t]{l|l|l|l|l|l|l}
\hline
& rYear & rDateTime & sub\_region & kW & rDoW & season\\
\hline
& Min. :2017 & Min. :2017-01-01 00:00:00 & Length:36280 & Min. : 0.00 & Sun:5304 & Spring:18404\\
\hline
& 1st Qu.:2017 & 1st Qu.:2017-02-13 06:30:00 & Class :character & 1st Qu.: 53.50 & Mon:5082 & Summer: 5451\\
\hline
& Median :2017 & Median :2017-03-27 12:22:30 & Mode :character & Median : 73.67 & Tue:5301 & Autumn: 0\\
\hline
& Mean :2017 & Mean :2017-03-29 12:58:45 & NA & Mean : 76.09 & Wed:5131 & Winter:12425\\
\hline
& 3rd Qu.:2017 & 3rd Qu.:2017-05-12 00:41:15 & NA & 3rd Qu.: 96.00 & Thu:5190 & NA\\
\hline
& Max. :2017 & Max. :2017-06-30 23:45:00 & NA & Max. :241.25 & Fri:5328 & NA\\
\hline
& NA & NA & NA & NA & Sat:4944 & NA\\
\hline
\end{tabular}
\end{table}
Do a sense check by season \& feeder.
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{t <-}\StringTok{ }\NormalTok{dt[, .(}\DataTypeTok{mean_kW =} \KeywordTok{mean}\NormalTok{(kW),}
\DataTypeTok{nObs =}\NormalTok{ .N), keyby =}\StringTok{ }\NormalTok{.(rYear, sub_region,season)]}
\NormalTok{NAt <-}\StringTok{ }\NormalTok{dt[}\KeywordTok{is.na}\NormalTok{(kW), .(}\DataTypeTok{nObs =}\NormalTok{ .N), keyby =}\StringTok{ }\NormalTok{.(rYear, sub_region,season)]}
\NormalTok{kableExtra}\OperatorTok{::}\KeywordTok{kable}\NormalTok{(t,}
\DataTypeTok{caption =} \StringTok{"Sense check on raw data"}\NormalTok{) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{kable_styling}\NormalTok{()}
\end{Highlighting}
\end{Shaded}
\begin{table}
\caption{\label{tab:senseCheck}Sense check on raw data}
\centering
\begin{tabular}[t]{r|l|l|r|r}
\hline
rYear & sub\_region & season & mean\_kW & nObs\\
\hline
2017 & C1T0 & Spring & 70.263621 & 3168\\
\hline
2017 & C1T0 & Summer & 55.561198 & 939\\
\hline
2017 & C1T0 & Winter & 99.396705 & 2090\\
\hline
2017 & C2T0 & Spring & 77.848916 & 3034\\
\hline
2017 & C2T0 & Summer & 68.153952 & 941\\
\hline
2017 & C2T0 & Winter & 102.823924 & 1841\\
\hline
2017 & E1L5 & Spring & 83.343390 & 7289\\
\hline
2017 & E1L5 & Summer & 68.625712 & 2226\\
\hline
2017 & E1L5 & Winter & 116.024016 & 4872\\
\hline
2017 & E2L5 & Spring & 10.333572 & 330\\
\hline
2017 & E2L5 & Summer & 8.378103 & 61\\
\hline
2017 & E2L5 & Winter & 13.210987 & 279\\
\hline
2017 & E3L5 & Spring & 45.101418 & 4583\\
\hline
2017 & E3L5 & Summer & 35.520381 & 1284\\
\hline
2017 & E3L5 & Winter & 60.735464 & 3343\\
\hline
\end{tabular}
\end{table}
Histograms of kW by season and feeder\ldots{}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(dt, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ kW)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_histogram}\NormalTok{(}\DataTypeTok{binwidth =} \DecValTok{5}\NormalTok{) }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(sub_region }\OperatorTok{~}\StringTok{ }\NormalTok{season)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/histo-1.pdf}
Demand profiles of kW by season and feeder and day of the week\ldots{}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{plotDT <-}\StringTok{ }\NormalTok{dt[, .(}\DataTypeTok{meankW =} \KeywordTok{mean}\NormalTok{(kW)), keyby =}\StringTok{ }\NormalTok{.(rTime, season, sub_region, rDoW)]}
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(plotDT, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ rTime, }\DataTypeTok{y =}\NormalTok{ meankW, }\DataTypeTok{colour =}\NormalTok{ season)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_line}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(sub_region }\OperatorTok{~}\StringTok{ }\NormalTok{rDoW)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/kwProfiles-1.pdf}
Is that what we expect?
\hypertarget{test-for-missing}{%
\section{Test for missing}\label{test-for-missing}}
Can we see missing data?
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(dt, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ rDate, }\DataTypeTok{y =}\NormalTok{ rTime, }\DataTypeTok{fill =}\NormalTok{ kW)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_tile}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(sub_region }\OperatorTok{~}\StringTok{ }\NormalTok{.) }\OperatorTok{+}
\StringTok{ }\KeywordTok{scale_fill_viridis_c}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{caption =} \StringTok{"All kW values by feeder, time (y) and date (x)"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/missingVis-1.pdf}
oooh.
Try aggregating\ldots{}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{dt[, rHour }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{lubridate}\OperatorTok{::}\KeywordTok{hour}\NormalTok{(rDateTime)]}
\NormalTok{plotDT <-}\StringTok{ }\NormalTok{dt[, .(}\DataTypeTok{mean_kW =} \KeywordTok{mean}\NormalTok{(kW),}
\DataTypeTok{nObs =}\NormalTok{ .N), keyby =}\StringTok{ }\NormalTok{.(rHour, rDate, sub_region)]}
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(plotDT, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ rDate, }\DataTypeTok{y =}\NormalTok{ rHour, }\DataTypeTok{fill =}\NormalTok{ mean_kW)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_tile}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{scale_fill_viridis_c}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(sub_region }\OperatorTok{~}\StringTok{ }\NormalTok{.) }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{caption =} \StringTok{"Mean kW per hour"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/aggVis-1.pdf}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(plotDT, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ rDate, }\DataTypeTok{y =}\NormalTok{ rHour, }\DataTypeTok{fill =}\NormalTok{ nObs)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_tile}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{scale_fill_viridis_c}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(sub_region }\OperatorTok{~}\StringTok{ }\NormalTok{.) }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{caption =} \StringTok{"Number of obs per hour"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/aggVis-2.pdf}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(plotDT, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ nObs, }\DataTypeTok{y =}\NormalTok{ mean_kW, }\DataTypeTok{group =}\NormalTok{ nObs)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_boxplot}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(.}\OperatorTok{~}\NormalTok{sub_region) }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{caption =} \StringTok{"mean kW per hour by number of observations contributing"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/aggVis-3.pdf}
\hypertarget{which-days-have-the-least-missing}{%
\section{Which days have the `least' missing?}\label{which-days-have-the-least-missing}}
This is quite tricky as we may have completely missing dateTimes. But we can test for this by counting the number of observations per dateTime and then seeing if the dateTimes are contiguous.
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{dateTimesDT <-}\StringTok{ }\NormalTok{dt[, .(}\DataTypeTok{nFeeders =} \KeywordTok{uniqueN}\NormalTok{(sub_region)), keyby =}\StringTok{ }\NormalTok{.(rDateTime, rTime, rDate, season)] }\CommentTok{# keep season}
\NormalTok{dateTimesDT[, dtDiff }\OperatorTok{:}\ErrorTok{=}\StringTok{ }\NormalTok{rDateTime }\OperatorTok{-}\StringTok{ }\KeywordTok{shift}\NormalTok{(rDateTime)] }\CommentTok{# should be 15 mins}
\KeywordTok{summary}\NormalTok{(dateTimesDT)}
\end{Highlighting}
\end{Shaded}
\begin{verbatim}
## rDateTime rTime rDate
## Min. :2017-01-01 00:00:00 Length:15673 Min. :2017-01-01
## 1st Qu.:2017-02-13 11:30:00 Class1:hms 1st Qu.:2017-02-13
## Median :2017-03-29 03:15:00 Class2:difftime Median :2017-03-29
## Mean :2017-03-30 10:30:58 Mode :numeric Mean :2017-03-29
## 3rd Qu.:2017-05-14 00:15:00 3rd Qu.:2017-05-14
## Max. :2017-06-30 23:45:00 Max. :2017-06-30
## season nFeeders dtDiff
## Spring:7954 Min. :1.000 Length:15673
## Summer:2415 1st Qu.:1.000 Class :difftime
## Autumn: 0 Median :2.000 Mode :numeric
## Winter:5304 Mean :2.315
## 3rd Qu.:3.000
## Max. :5.000
\end{verbatim}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(dateTimesDT, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ rDate, }\DataTypeTok{y =}\NormalTok{ rTime, }\DataTypeTok{fill =}\NormalTok{ nFeeders)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_tile}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{scale_fill_viridis_c}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{caption =} \StringTok{"Number of unique feeders in each dateTime"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/testDateTimes-1.pdf}
Well we clearly have some dateTimes where we have no data \emph{at all}!
Are there time of day patterns? It looks like it\ldots{}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{plotDT <-}\StringTok{ }\NormalTok{dateTimesDT[, .(}\DataTypeTok{meanN =} \KeywordTok{mean}\NormalTok{(nFeeders)), keyby =}\StringTok{ }\NormalTok{.(rTime, season)]}
\NormalTok{ggplot2}\OperatorTok{::}\KeywordTok{ggplot}\NormalTok{(plotDT, }\KeywordTok{aes}\NormalTok{(}\DataTypeTok{y =}\NormalTok{ meanN, }\DataTypeTok{x =}\NormalTok{ rTime, }\DataTypeTok{colour =}\NormalTok{ season)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_line}\NormalTok{() }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{y =} \StringTok{"Mean n feeders reporting"}\NormalTok{,}
\DataTypeTok{caption =} \StringTok{"Mean n feeders by time of day"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\includegraphics{cleaningFeederData_files/figure-latex/missingProfiles-1.pdf}
So\ldots{}
I find it distinctly odd that:
\begin{itemize}
\tightlist
\item
we appear to have the most feeders reporting data at `peak' times
\item
we have a lot of missing dateTimes between 00:30 and 05:00
\end{itemize}
If the monitors were set to only collect data when the power (or Wh in a given time frame) was above a given threshold then it would look like this\ldots{}
\hypertarget{runtime}{%
\section{Runtime}\label{runtime}}
Analysis completed in 15.32 seconds ( 0.26 minutes) using \href{https://cran.r-project.org/package=knitr}{knitr} in \href{http://www.rstudio.com}{RStudio} with R version 3.6.3 (2020-02-29) running on x86\_64-apple-darwin15.6.0.
\hypertarget{r-environment}{%
\section{R environment}\label{r-environment}}
\hypertarget{r-packages-used}{%
\subsection{R packages used}\label{r-packages-used}}
\begin{itemize}
\tightlist
\item
base R (R Core Team 2016)
\item
bookdown (Xie 2016a)
\item
data.table (Dowle et al. 2015)
\item
ggplot2 (Wickham 2009)
\item
kableExtra (Zhu 2018)
\item
knitr (Xie 2016b)
\item
lubridate (Grolemund and Wickham 2011)
\item
rmarkdown (Allaire et al. 2018)
\item
skimr (Arino de la Rubia et al. 2017)
\end{itemize}
\hypertarget{session-info}{%
\subsection{Session info}\label{session-info}}
\begin{verbatim}
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Catalina 10.15.5
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib
##
## locale:
## [1] en_NZ.UTF-8/en_NZ.UTF-8/en_NZ.UTF-8/C/en_NZ.UTF-8/en_NZ.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] skimr_2.1 kableExtra_1.1.0 ggplot2_3.3.0 hms_0.5.3
## [5] lubridate_1.7.4 data.table_1.12.8
##
## loaded via a namespace (and not attached):
## [1] Rcpp_1.0.4 compiler_3.6.3 pillar_1.4.3 base64enc_0.1-3
## [5] tools_3.6.3 digest_0.6.25 jsonlite_1.6.1 viridisLite_0.3.0
## [9] evaluate_0.14 lifecycle_0.2.0 tibble_2.1.3 gtable_0.3.0
## [13] pkgconfig_2.0.3 rlang_0.4.5 rstudioapi_0.11 yaml_2.2.1
## [17] xfun_0.12 repr_1.1.0 xml2_1.2.5 httr_1.4.1
## [21] withr_2.1.2 stringr_1.4.0 dplyr_0.8.5 knitr_1.28
## [25] vctrs_0.2.4 webshot_0.5.2 grid_3.6.3 tidyselect_1.0.0
## [29] glue_1.3.2 R6_2.4.1 rmarkdown_2.1 bookdown_0.18
## [33] farver_2.0.3 purrr_0.3.3 readr_1.3.1 magrittr_1.5
## [37] scales_1.1.0 htmltools_0.4.0 rvest_0.3.5 assertthat_0.2.1
## [41] colorspace_1.4-1 labeling_0.3 stringi_1.4.6 munsell_0.5.0
## [45] crayon_1.3.4
\end{verbatim}
\hypertarget{the-data-cleaning-code}{%
\section{The data cleaning code}\label{the-data-cleaning-code}}
\begin{enumerate}
\def\labelenumi{(\alph{enumi})}
\setcounter{enumi}{2}
\tightlist
\item
Mikey Harper :-)
\end{enumerate}
Starts here:
Scripts used clean and merge substation data.
\hypertarget{input-files}{%
\subsection{Input files}\label{input-files}}
Analysis will first look at the primary data. There are different types of files which refer to different paramters. Different search terms are used to extract these:
\begin{Shaded}
\begin{Highlighting}[]
\CommentTok{# Find files with AMPS. Exclude files which contain DI~CO}
\NormalTok{files_AMPS <-}\StringTok{ }\KeywordTok{list.files}\NormalTok{(}\StringTok{"../Primary"}\NormalTok{, }\DataTypeTok{recursive =}\NormalTok{ T, }\DataTypeTok{pattern =} \StringTok{"~AMPS"}\NormalTok{, }\DataTypeTok{full.names =}\NormalTok{ T) }\OperatorTok{%>%}
\StringTok{ }\NormalTok{.[}\OperatorTok{!}\NormalTok{stringr}\OperatorTok{::}\KeywordTok{str_detect}\NormalTok{ (., }\StringTok{"DI~CO"}\NormalTok{)]}
\NormalTok{files_AMPS}
\end{Highlighting}
\end{Shaded}
\hypertarget{process-amps}{%
\subsection{Process Amps}\label{process-amps}}
\begin{Shaded}
\begin{Highlighting}[]
\CommentTok{# Show a sample}
\NormalTok{fileSelect <-}\StringTok{ }\NormalTok{files_AMPS[}\DecValTok{4}\NormalTok{]}
\KeywordTok{head}\NormalTok{(}\KeywordTok{read_csv}\NormalTok{(fileSelect, }\DataTypeTok{skip =} \DecValTok{3}\NormalTok{))}
\end{Highlighting}
\end{Shaded}
Again a function is used to do all the processing on the input CSVs. This is slightly amended from the \texttt{processkV} function.
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{processAMPS <-}\StringTok{ }\ControlFlowTok{function}\NormalTok{(filePath, }\DataTypeTok{databaseCon =}\NormalTok{ con)\{}
\KeywordTok{message}\NormalTok{(}\StringTok{"Processing "}\NormalTok{, filePath)}
\CommentTok{# 1st Level}
\NormalTok{ dirName_}\DecValTok{1}\NormalTok{ <-}\StringTok{ }\NormalTok{filePath }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{dirname}\NormalTok{() }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\NormalTok{basename}
\CommentTok{# 2nd Level}
\NormalTok{ dirName_}\DecValTok{2}\NormalTok{ <-}\StringTok{ }\NormalTok{filePath }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{dirname}\NormalTok{() }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{dirname}\NormalTok{() }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\NormalTok{basename}
\ControlFlowTok{if}\NormalTok{ (dirName_}\DecValTok{2} \OperatorTok{==}\StringTok{ "Primary"}\NormalTok{)\{}
\NormalTok{ dirName_}\DecValTok{2}\NormalTok{ <-}\StringTok{ }\NormalTok{dirName_}\DecValTok{1}
\NormalTok{ dirName_}\DecValTok{1}\NormalTok{ <-}\StringTok{ ""}
\NormalTok{ \}}
\CommentTok{# Load the CSV. There were some tab seperated files which are saved as CSVs, which confuse the search. There if the data is loaded incorrectly (only having a single column), the code will try and load it as a TSV.}
\NormalTok{ dataLoaded <-}\StringTok{ }\KeywordTok{suppressWarnings}\NormalTok{(}\KeywordTok{read_csv}\NormalTok{(filePath, }\DataTypeTok{skip =} \DecValTok{3}\NormalTok{, }\DataTypeTok{col_types =} \KeywordTok{cols}\NormalTok{(}\DataTypeTok{Value =} \KeywordTok{col_number}\NormalTok{())))}
\ControlFlowTok{if}\NormalTok{(}\KeywordTok{ncol}\NormalTok{(dataLoaded) }\OperatorTok{==}\StringTok{ }\DecValTok{1}\NormalTok{)\{}
\NormalTok{ dataLoaded <-}\StringTok{ }\KeywordTok{suppressWarnings}\NormalTok{(}\KeywordTok{read_tsv}\NormalTok{(filePath, }\DataTypeTok{skip =} \DecValTok{3}\NormalTok{, }\DataTypeTok{col_types =} \KeywordTok{cols}\NormalTok{()))}
\NormalTok{ \}}
\CommentTok{# Reformat data}
\NormalTok{ dataLoaded <-}
\StringTok{ }\NormalTok{dataLoaded }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{mutate_at}\NormalTok{(}\KeywordTok{vars}\NormalTok{(Time), }\ControlFlowTok{function}\NormalTok{(x)\{}\KeywordTok{gsub}\NormalTok{(}\StringTok{'[^ -~]'}\NormalTok{, }\StringTok{''}\NormalTok{, x)\}) }\OperatorTok{%>%}\StringTok{ }\CommentTok{# Remove invalid UTF characters}
\StringTok{ }\KeywordTok{mutate}\NormalTok{(}\DataTypeTok{Time =}\NormalTok{ lubridate}\OperatorTok{::}\KeywordTok{dmy_hms}\NormalTok{(Time),}
\DataTypeTok{Time =}\NormalTok{ lubridate}\OperatorTok{::}\KeywordTok{floor_date}\NormalTok{(Time, }\DataTypeTok{unit =} \StringTok{"15 minutes"}\NormalTok{)) }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{group_by}\NormalTok{(Time) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{summarise}\NormalTok{(}\DataTypeTok{Value =} \KeywordTok{mean}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T)) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{mutate}\NormalTok{(}\DataTypeTok{region =}\NormalTok{ dirName_}\DecValTok{2}\NormalTok{,}
\DataTypeTok{sub_region =}\NormalTok{ dirName_}\DecValTok{1}
\NormalTok{ )}
\CommentTok{# There are some datasets which contain no values, whch can cause errors in running}
\CommentTok{# If this happens, return NULL}
\ControlFlowTok{if}\NormalTok{(}\KeywordTok{is.character}\NormalTok{(dataLoaded}\OperatorTok{$}\NormalTok{Value)) }\KeywordTok{return}\NormalTok{(}\OtherTok{NULL}\NormalTok{)}
\KeywordTok{return}\NormalTok{(dataLoaded)}
\NormalTok{\}}
\end{Highlighting}
\end{Shaded}
Run the function below:
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{Amps <-}\StringTok{ }\NormalTok{purrr}\OperatorTok{::}\KeywordTok{map_df}\NormalTok{(files_AMPS, processAMPS)}
\end{Highlighting}
\end{Shaded}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{Amps_stats <-}\StringTok{ }\NormalTok{Amps }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{group_by}\NormalTok{(region) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{summarise}\NormalTok{(}\DataTypeTok{mean =}\NormalTok{ (}\KeywordTok{mean}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T)),}
\DataTypeTok{n =} \KeywordTok{n}\NormalTok{(),}
\DataTypeTok{sd =} \KeywordTok{sd}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T),}
\DataTypeTok{var =} \KeywordTok{var}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T))}
\NormalTok{Amps_stats}
\NormalTok{readr}\OperatorTok{::}\KeywordTok{write_csv}\NormalTok{(Amps_stats, }\DataTypeTok{path =} \StringTok{"../Amps_stats.csv"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{ggplot}\NormalTok{(Amps) }\OperatorTok{+}
\StringTok{ }\KeywordTok{geom_point}\NormalTok{(}\KeywordTok{aes}\NormalTok{(}\DataTypeTok{x =}\NormalTok{ Time, }\DataTypeTok{y =}\NormalTok{ Value, }\DataTypeTok{colour =}\NormalTok{ region)) }\OperatorTok{+}
\StringTok{ }\KeywordTok{facet_grid}\NormalTok{(region}\OperatorTok{~}\NormalTok{., }\DataTypeTok{scales =} \StringTok{"free_y"}\NormalTok{) }\OperatorTok{+}
\StringTok{ }\KeywordTok{labs}\NormalTok{(}\DataTypeTok{title =} \StringTok{"Cleaned data for Amps"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\hypertarget{processing-data}{%
\subsection{Processing data}\label{processing-data}}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{readr}\OperatorTok{::}\KeywordTok{write_csv}\NormalTok{(Amps, }\DataTypeTok{path =} \StringTok{"amps_all_substations.csv"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{library}\NormalTok{(odbc)}
\KeywordTok{library}\NormalTok{(DBI)}
\CommentTok{# Create an ephemeral in-memory RSQLite database}
\NormalTok{con <-}\StringTok{ }\KeywordTok{dbConnect}\NormalTok{(RSQLite}\OperatorTok{::}\KeywordTok{SQLite}\NormalTok{(), }\StringTok{"amps.sqlite"}\NormalTok{)}
\KeywordTok{dbListTables}\NormalTok{(con)}
\KeywordTok{dbWriteTable}\NormalTok{(con, }\StringTok{"amps"}\NormalTok{, Amps)}
\KeywordTok{dbListTables}\NormalTok{(con)}
\end{Highlighting}
\end{Shaded}
\hypertarget{querying-the-data}{%
\subsection{Querying the data}\label{querying-the-data}}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{con <-}\StringTok{ }\KeywordTok{dbConnect}\NormalTok{(RSQLite}\OperatorTok{::}\KeywordTok{SQLite}\NormalTok{(), }\StringTok{"amps.sqlite"}\NormalTok{)}
\KeywordTok{library}\NormalTok{(dbplyr)}
\NormalTok{Amps_db <-}\StringTok{ }\KeywordTok{tbl}\NormalTok{(con, }\StringTok{"amps"}\NormalTok{)}
\NormalTok{flights_db }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{group_by}\NormalTok{(region) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{summarise}\NormalTok{(}\DataTypeTok{mean =}\NormalTok{ (}\KeywordTok{mean}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T)),}
\DataTypeTok{n =} \KeywordTok{n}\NormalTok{(),}
\DataTypeTok{sd =} \KeywordTok{sd}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T),}
\DataTypeTok{var =} \KeywordTok{var}\NormalTok{(Value, }\DataTypeTok{na.rm =}\NormalTok{ T))}
\end{Highlighting}
\end{Shaded}
\hypertarget{round-to-nearest-n-minutes}{%
\subsection{Round to Nearest N minutes}\label{round-to-nearest-n-minutes}}
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{processAMPS_5mins <-}\StringTok{ }\ControlFlowTok{function}\NormalTok{(filePath)\{}
\KeywordTok{message}\NormalTok{(}\StringTok{"Processing "}\NormalTok{, filePath)}
\CommentTok{# 1st Level}
\NormalTok{ dirName_}\DecValTok{1}\NormalTok{ <-}\StringTok{ }\NormalTok{filePath }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{dirname}\NormalTok{() }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\NormalTok{basename}
\CommentTok{# 2nd Level}
\NormalTok{ dirName_}\DecValTok{2}\NormalTok{ <-}\StringTok{ }\NormalTok{filePath }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{dirname}\NormalTok{() }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\KeywordTok{dirname}\NormalTok{() }\OperatorTok{%>%}\StringTok{ }
\StringTok{ }\NormalTok{basename}
\ControlFlowTok{if}\NormalTok{ (dirName_}\DecValTok{2} \OperatorTok{==}\StringTok{ "Primary"}\NormalTok{)\{}
\NormalTok{ dirName_}\DecValTok{2}\NormalTok{ <-}\StringTok{ }\NormalTok{dirName_}\DecValTok{1}
\NormalTok{ dirName_}\DecValTok{1}\NormalTok{ <-}\StringTok{ ""}
\NormalTok{ \}}
\CommentTok{# Load the CSV. There were some tab seperated files which are saved as CSVs, which confuse the search. There if the data is loaded incorrectly (only having a single column), the code will try and load it as a TSV.}
\NormalTok{ dataLoaded <-}\StringTok{ }\KeywordTok{suppressWarnings}\NormalTok{(}\KeywordTok{read_csv}\NormalTok{(filePath, }\DataTypeTok{skip =} \DecValTok{3}\NormalTok{, }\DataTypeTok{col_types =} \KeywordTok{cols}\NormalTok{()))}
\ControlFlowTok{if}\NormalTok{(}\KeywordTok{ncol}\NormalTok{(dataLoaded) }\OperatorTok{==}\StringTok{ }\DecValTok{1}\NormalTok{)\{}
\NormalTok{ dataLoaded <-}\StringTok{ }\KeywordTok{suppressWarnings}\NormalTok{(}\KeywordTok{read_tsv}\NormalTok{(filePath, }\DataTypeTok{skip =} \DecValTok{3}\NormalTok{, }\DataTypeTok{col_types =} \KeywordTok{cols}\NormalTok{()))}
\NormalTok{ \}}
\CommentTok{# Reformat data}
\NormalTok{ dataLoaded <-}
\StringTok{ }\NormalTok{dataLoaded }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{mutate_at}\NormalTok{(}\KeywordTok{vars}\NormalTok{(Time), }\ControlFlowTok{function}\NormalTok{(x)\{}\KeywordTok{gsub}\NormalTok{(}\StringTok{'[^ -~]'}\NormalTok{, }\StringTok{''}\NormalTok{, x)\}) }\OperatorTok{%>%}\StringTok{ }\CommentTok{# Remove invalid UTF characters}
\StringTok{ }\KeywordTok{mutate}\NormalTok{(}\DataTypeTok{Time =}\NormalTok{ lubridate}\OperatorTok{::}\KeywordTok{dmy_hms}\NormalTok{(Time),}
\DataTypeTok{region =}\NormalTok{ dirName_}\DecValTok{2}\NormalTok{,}
\DataTypeTok{sub_region =}\NormalTok{ dirName_}\DecValTok{1}\NormalTok{,}
\DataTypeTok{code =} \KeywordTok{paste}\NormalTok{(region, sub_region, }\DataTypeTok{sep =} \StringTok{"_"}\NormalTok{),}
\NormalTok{ ) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{mutate}\NormalTok{(}\DataTypeTok{Time =}\NormalTok{ lubridate}\OperatorTok{::}\KeywordTok{floor_date}\NormalTok{(Time, }\DataTypeTok{unit =} \StringTok{"5 minutes"}\NormalTok{)) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{group_by}\NormalTok{(Time, region, code) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{summarise}\NormalTok{(}\DataTypeTok{Value =} \KeywordTok{mean}\NormalTok{(Value)) }\OperatorTok{%>%}
\StringTok{ }\KeywordTok{arrange}\NormalTok{(Time)}
\CommentTok{# There are some datasets which contain no values, whch can cause errors in running}
\CommentTok{# If this happens, return NULL}
\ControlFlowTok{if}\NormalTok{(}\KeywordTok{is.character}\NormalTok{(dataLoaded}\OperatorTok{$}\NormalTok{Value)) }\KeywordTok{return}\NormalTok{(}\OtherTok{NULL}\NormalTok{)}
\CommentTok{# Returns the loaded and cleaned dataframe}
\KeywordTok{return}\NormalTok{(dataLoaded)}
\NormalTok{\}}
\end{Highlighting}
\end{Shaded}
Nearest 5 minutes:
\begin{Shaded}
\begin{Highlighting}[]
\NormalTok{Amps_5mins <<-}\StringTok{ }\NormalTok{purrr}\OperatorTok{::}\KeywordTok{map_df}\NormalTok{(files_AMPS[}\DecValTok{1}\OperatorTok{:}\DecValTok{4}\NormalTok{], processAMPS_5mins)}
\end{Highlighting}
\end{Shaded}
\hypertarget{references}{%
\section*{References}\label{references}}
\addcontentsline{toc}{section}{References}
\hypertarget{refs}{}
\leavevmode\hypertarget{ref-rmarkdown}{}%
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, and Winston Chang. 2018. \emph{Rmarkdown: Dynamic Documents for R}. \url{https://CRAN.R-project.org/package=rmarkdown}.
\leavevmode\hypertarget{ref-skimr}{}%
Arino de la Rubia, Eduardo, Hao Zhu, Shannon Ellis, Elin Waring, and Michael Quinn. 2017. \emph{Skimr: Skimr}. \url{https://github.com/ropenscilabs/skimr}.
\leavevmode\hypertarget{ref-data.table}{}%
Dowle, M, A Srinivasan, T Short, S Lianoglou with contributions from R Saporta, and E Antonyan. 2015. \emph{Data.table: Extension of Data.frame}. \url{https://CRAN.R-project.org/package=data.table}.
\leavevmode\hypertarget{ref-lubridate}{}%
Grolemund, Garrett, and Hadley Wickham. 2011. ``Dates and Times Made Easy with lubridate.'' \emph{Journal of Statistical Software} 40 (3): 1--25. \url{http://www.jstatsoft.org/v40/i03/}.
\leavevmode\hypertarget{ref-baseR}{}%
R Core Team. 2016. \emph{R: A Language and Environment for Statistical Computing}. Vienna, Austria: R Foundation for Statistical Computing. \url{https://www.R-project.org/}.
\leavevmode\hypertarget{ref-ggplot2}{}%
Wickham, Hadley. 2009. \emph{Ggplot2: Elegant Graphics for Data Analysis}. Springer-Verlag New York. \url{http://ggplot2.org}.
\leavevmode\hypertarget{ref-bookdown}{}%
Xie, Yihui. 2016a. \emph{Bookdown: Authoring Books and Technical Documents with R Markdown}. Boca Raton, Florida: Chapman; Hall/CRC. \url{https://github.com/rstudio/bookdown}.
\leavevmode\hypertarget{ref-knitr}{}%
---------. 2016b. \emph{Knitr: A General-Purpose Package for Dynamic Report Generation in R}. \url{https://CRAN.R-project.org/package=knitr}.
\leavevmode\hypertarget{ref-kableExtra}{}%
Zhu, Hao. 2018. \emph{KableExtra: Construct Complex Table with 'Kable' and Pipe Syntax}. \url{https://CRAN.R-project.org/package=kableExtra}.
\end{document}