| Title: | Portable Emissions (and Other Mobile) Measurement System Utilities |
| Version: | 0.3.0.8 |
| Date: | 2025-06-20 |
| Description: | Utility functions for the handling, analysis and visualisation of data from portable emissions measurement systems ('PEMS') and other similar mobile activity monitoring devices. The package includes a dedicated 'pems' data class that manages many of the quality control, unit handling and data archiving issues that can hinder efforts to standardise 'PEMS' research. |
| Type: | Package |
| Author: | Karl Ropkins [aut, cre], Adrian Felipe Ortega Calle [ctb] |
| Maintainer: | Karl Ropkins <karl.ropkins@gmail.com> |
| URL: | http://pems.r-forge.r-project.org/ |
| Depends: | R (≥ 2.10.0) |
| Imports: | lattice, loa (≥ 0.3.1), methods, utils, grid, baseline, ggplot2, rlang, tibble, dplyr |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| LazyLoad: | yes |
| LazyData: | yes |
| RoxygenNote: | 7.3.2 |
| Encoding: | UTF-8 |
| NeedsCompilation: | no |
| Packaged: | 2025-06-20 15:59:08 UTC; trakradmin |
| Repository: | CRAN |
| Date/Publication: | 2025-06-20 21:30:02 UTC |
pems.utils
Description
The R package pems.utils contains a range of functions for the routine handling and analysis of data collected by portable emissions measurement systems (PEMS) and other similar mobile monitoring systems.
Details
| Package: | pems.utils |
| Type: | Package |
| Version: | 0.3.0.7 |
| Date: | 2024-12-28 |
| License: | GPL (>= 2) |
| LazyLoad: | yes |
The pems.utils functions have been arranged according to usage, as
follows:
1. Getting data in and out of pems.utils.
1.1. Functions for making and importing datasets for use with pems.utils: pems,
import2PEMS, etc.
1.2. Exporting data from pems objects and R: export.data.
2. Data Structure and General Handling
2.1. The pems object structure: pems.structure, getPEMSElement,
pemsData, etc.
3. Generic pems handling
3.1. pems objects, pems.generics.
3.2. pems.element objects, pems.element.generics.
4. Structure Handling
4.1. Merging pems objects: merge.pems, align, etc.
4.2. Referencing pems objects: referencing.pems.data, refRow, etc.
4.3. Time handling functions: regularize, etc.
4.4. Unit handler functions: getUnits, setUnits, convertUnits, etc.
5. pems Data Handling
5.1. Plots for pems objects: pems.plots, latticePlot, pemsPlot, etc.
6. Calculations
6.1. Common calculations: common.calculations, calcDistance, calcAccel, etc.
6.2. Common check... functions for the routine handling of function arguments/user inputs.
6.3. Other correction code
6.4. Analysing data in pems objects: summary.reports
7. Refernce datasets, examples, look-up tables, etc.
7.1. Example datasets: pems.1.
7.2. look-up tables: ref.unit.conversions, etc.
8. Specialist code
8.1. VSP calculations: calcVSP, etc.
8.2. Emissions calculations: calcEm, etc.
9. Other Code
9.1. Tidyverse related code... pems.tidyverse
Author(s)
Karl Ropkins Maintainer: Karl Ropkins <k.ropkins@its.leeds.ac.uk>
References
Functions in pems.utils make extensive use of code developed by others.
In particular, I gratefully acknowledge the huge contributions of the R Core Team
and numerous contributors in developing and maintaining R:
R Development Core Team (2011). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org/.
See Also
making and importing data
Description
Various pems.utils functions to make and import data as pems objects.
Usage
#making pems objects
is.pems(x, full.test = TRUE, ...)
pems(x, units = NULL, constants = NULL, history = NULL,
...)
pems.element(x, name = NULL, units = NULL,
...)
#associated
isPEMS(...)
makePEMS(...)
makePEMSElement(...)
rebuildPEMS(x, ...)
## S3 method for class 'data.frame'
as.pems(x, ...)
#importing data as pems objects
#general
import2PEMS(file.name = file.choose(), ...,
file.reader = read.delim,
output="pems")
importTAB2PEMS(..., file.reader = read.delim)
importCSV2PEMS(..., file.reader = read.csv)
#Horiba OBS
importOBS2PEMS(file.name = file.choose(),
pems = "Horiba OBS",
constants = NULL, history = NULL,
analytes = c("co", "co2", "nox", "hc"),
fuel = c("petrol", "diesel", "gasoline"), ...)
importOB12PEMS(file.name = file.choose(),
pems = "Horiba OBS",
constants = NULL, history = NULL,
analytes = c("co", "co2", "nox", "hc"),
fuel = c("petrol", "diesel", "gasoline"), ...)
#3DATX parSYNC
importParSYNC2PEMS(file.name = file.choose(),
reset.signals = TRUE,
history = NULL, constants = NULL,
pm.analyzer = "parSYNC", ... )
#3DATX CAGE
importCAGE2PEMS(..., calibrator = "CAGE")
#Sensors Inc SEMTECH
importSEMTECH2PEMS(file.name = file.choose(),
history = NULL, constants = NULL,
pems = "SEMTECH", ...)
#RoyalTek GPS
importRoyalTek2PEMS(file.name = file.choose(),
file.type = c("special", "txt", "nmea"),
vbox = "RoyalTEk", history = NULL,
constants = NULL, ...)
#KML files
importKML2PEMS(file.name = file.choose(), history = NULL,
constants = NULL, source = "Unknown", ...)
Arguments
x |
(A required object) For |
full.test |
(Logical) For |
... |
(Optional) Other arguments, handling varies. For
|
units, constants, history |
(Default pems arguments) These are arguments that are routinely generated for
|
name |
(Default pems.element argument) |
file.name |
(file connection, etc.) For |
file.type, file.reader |
Data reader parameters for some |
output |
Where included in formal arguments, an option to control function output. |
pems, vbox, pm.analyzer, calibrator, source |
(Character vectors) For some |
analytes |
(Character vector) For |
fuel |
Some |
reset.signals |
(Logical or Character vector) For |
Details
is.pems tests if an object is/is not a pems object.
pems makes a pems object using supplied data and information.
pems.element makes a pems.element object using supplied data and information.
as.pems... functions attempt to convert a supplied object into a pems object.
Currently, there is only a data.frame method and (by default) a pems
method.
isPEMS, makePEMS and makePEMSElement are historical code, retained for
backward compatibility.
rebuildPEMS rebuilds pems object as a different build version.
Crude import... functions import simple file structures, and are useful for getting
data quickly into R:pems.utils. importTAB2PEMS imports tab delimited files and
clipboard content. importCSV2PEMS imports comma delimited files. Both assume a simple
file structure (i.e. data series in columns with names as headers), but require some time data
management by the user. Note: These are wrappers for import2PEMS.
Other import... import specific file types.
importOBS2PEMS imports standard Horiba OBS files and converts them to pems
objects. See Notes below.
importOB12PEMS imports .OB1 files and converts them to pems objects. OB1
files are generated by a Visual Basic PEMS data handler used during the RETEMM project. Notes below.
importParSYNC2PEMS imports standard parSYNC files and converts them to pems
objects. See Notes below.
importCAGE2PEMS imports standard CAGE files and converts them to pems objects.
See importParSYNC2PEMS Notes below.
importSEMTECH2PEMS imports Sensors Inc. SEMTECH ECOSTAR files and converts them to pems
objects. See Notes below.
importRoyalTek2PEMS imports .txt and .nmea format Royal Tek GPS files and
converts them to pems objects. See Notes below.
importKML2PEMS imports .kml format KML files and
converts them to pems objects. See Notes below.
Value
is.pems return a logical, TRUE if the supplied object is pems class,
otherwise FALSE. If the argument full.test = TRUE is also supplied, additional
information about the object is returned as comment(output).
pems and pems.element functions return pems and pems.element
objects, respectively, made using the supplied file and any additional information also
supplied in the same call.
rebuildPEMS rebuilts the supplied pems object. The default rebuilds as the lastest
build structure.
import... functions return a pems object, made using the supplied file and any
additional information also supplied in the same call.
Note
isPEMS, makePEMS and makePEMSElement were earlier functions that performed
the same functions as is.pems, pems and pems.elements, respectively. The
the current versions of these functions are wrappers for their replacements.
With the crude import... functions (import2PEMS, importTAB2PEMS,
importCSV2PEMS) modifications are minimal. Unless any additional changes are requested
in the import...(...) call, the data is simply read in as a data.frame and
converted to a pems object.
With importOBS2PEMS, OBS data is also modified as follows: data series names are simplified and
converted to lower case to simplify use in R; the data series time.stamp and local.time
are added (generated using the file time stamp, the row counter and the log.rate constant);
data series latitude and longitude are resigned according to set N/S and E/W values,
if these are present/valid; latitude and longitude units are also reset to 'd.degLat'
and 'd.degLon'. Any data series names in analytes is renamed 'conc.[analyte name]'.
If not supplied in the importOBS2PEMS, typical OBS constants are currently assumed. Several of these
are based on emission source fuel. Defaults for these are generated according to fuel (default
'petrol').
With importOB12PEMS, handling is similar to that with importOBS2PEMS.
With importParSYNC2PEMS, the parSYNC data modifications are as follows: parSYNC Date and Time
data-series are merged and converted into *POSIX as time.stamp; local.time is calculated
from this; the parSYNC data series Timestamp is retained as parsync.timestamp; by default units are
removed from data-series names, but retained as units(pems); (again by default) all names are
converted to lower case. The default option reset.signal = TRUE reverses the voltage reading
of opacity and ionization time-series (x = - x), if present. Alternatively, imports can be identified
specifically by name, e.g. reset.signal = "opacity" to just reset opacity. Typical OBS constants
are currently assumed, if not supplied. Several of these are based on emission source fuel. The default
assumption is that the fuel is 'petrol' unless fuel has been assigned.
With importCAGE2PEMS, handling is similar to that with importParSYNC2PEMS.
With importSEMTECH2PEMS, SEMTECH data is imported and modified as follows: data series names are simplified and
converted to lower case to simplify use in R; the data series time.stamp and local.time
are added (generated using the file time stamp). Defaults constants are assigned according to fuel (default
'petrol'). This function in in-development and has so far only been used with files from two
sources, so handle with care, and time.format has varied so may need resetting for some files.
With importRoyalTek2PEMS, the Royal Tek data modifications are currently being documented.
With importKML2PEMS, the function attempts to import and time.stamp, latitude, longtiude and altitude data
in the suppled KML file. This function in in-development and has so far only been used with KML files from one
source, so handle with care.
Author(s)
Karl Ropkins
References
References in preparation.
See Also
See ref.unit.conversions and convertUnits for general unit handling;
merge.pems for pems data merging and alignment.
Examples
###########
##example 1
###########
#make little pems
data <- data.frame(speed=1:10, emissions=1:10)
units <- c("m/s", "g/s")
pems <- pems(x = data, units=units, example="my record")
pems #the pems object
summary(pems) #summary of held data
pems$speed #the speed pems.element
#import data file as pems using import... functions
#For example, to import CSV file as pems object
## Not run:
pems <- importCSV2PEMS()
## End(Not run)
exporting PEMS data
Description
Some functions for exporting data from R and pems.utils.
Usage
exportPEMS(pems, file = "tempfile", file.writer = write.table,
sep = "\t", ...)
exportPEMS2TAB(pems, file = "tempfile", file.writer = write.table,
sep = "\t", ...)
exportPEMS2TAB(pems, file = "tempfile", file.writer = write.table,
sep = "\t", ...)
#exportPEMS2Excel
#currently disabled
Arguments
pems |
(A required object) The object to export from R, typically a |
file |
(Character) The name of the file to create when exporting data. This can be
|
file.writer, sep |
(Various arguments) |
... |
(Optional) Other arguments, handling varies. For |
Details
By default, exportPEMS2TAB and exportPEMS2CSV export the data component of a supplied
pems object, to tab-delimited .txt and comma-delimited .csv files,
respectively. file sets the file name (default tempfile).
These are typically used in form:
exportPEMS2...(pems, file, ...)
By default, they make the following associated modifications:
If file extensions are not included in file, they add .txt and .csv
extensions to tab-delimited and comma-delimited files, respectively. The argument
tidy.file=FALSE can be used to disable this modification.
Time stamps, if identified, are exported in "DD/MM/YYYY HH:MM:SS.x" format. Handling can be
altered using time.stamp, time.format and tz arguments like
import2PEMS or disabled using tidy.time.stamp=FALSE.
Data-series units can also be added to exported file column names in form name(units)
by adding the argument units="add.to.names".
Value
exportPEMS2...() functions generate export file from pems data.
Warning
Currently, exportPEMS... functions overwrite without warnings.
Note
exportPEMS2Excel is curently disabled.
These are very crude functions in the most part because they are rarely used. Suggestions for helpful improvements would be very welcome.
Author(s)
Karl Ropkins
References
References in preparation.
See Also
See import2PEMS, etc. for importing data into pems.utils.
Examples
###########
##example 1
###########
#making a comma-delimited copy of pems.1
## Not run:
exportPEMS2CSV(pems.1, "pems.example")
dir()
## End(Not run)
'pems' object structure
Description
This pages provides a brief outview description of the 'pems' object structure. It also lists some associated functions
Usage
getPEMSElement(x, pems = NULL, units = NULL, ...,
fun.name="getPEMSElement",
if.missing = "stop", if.null = if.missing,
track.name = TRUE, .x = enquo(x))
getPEMSData(pems=NULL, ..., fun.name = "getPEMSData",
if.missing = "stop", .pems = enquo(pems))
getPEMSConstants(pems=NULL, ...,
fun.name = "getPEMSConstants",
if.missing = "stop", .pems = enquo(pems))
pemsData(pems=NULL, ...,
fun.name = "pemsData", if.missing = "stop",
pems.name = deparse(substitute(pems)))
pemsConstants(pems=NULL, ...,
fun.name = "pemsConstants", if.missing = "stop",
pems.name = deparse(substitute(pems)))
pemsHistory(pems=NULL, ...,
fun.name = "pemsHistory", if.missing = "stop",
pems.name = deparse(substitute(pems)))
cpe(...)
Arguments
x |
(Required vector, typically pems.element) For
|
pems |
(pems object) If supplied, the |
units |
(Optional) The units that |
... |
(Optional) Other Arguments. |
fun.name, if.missing, if.null, track.name, pems.name, .x, .pems |
(Various) Other options using for |
Details
The pems object is a managed data.frame.
It has five main components: data,
units, constants, history and
tags. data is the main
data.frame. Each element (named
data.frame column) is a data-series of the
original PEMS data. units are the associated
unit definitions. constants is a list of
associated constants that are to be used with the
pems object. (The preference order is arguments
given in a call then constants declared in the
pems object then constant defaults held
by the pems.utils package.) history is a
log of pems object modifications. tags
are any other components that the user wishes to add
to a pems object as identifiers.
getPEMSElement gets a requested
pem.element from pems if supplied or
from the local workspace.
pemsData and getPEMSData get the
data component of a supplied pems object.
pemsConstants and getPEMSConstants get
all constants locally defined for the supplied
pems object.
pemsHistory gets the history of supplied
pems object.
cpe combines pems.elements. It is
intended as an alternative to
c(pems.element, ...) while
that generic is in-development.
Value
getPEMSElement returns the requested element
of a supplied pems object as a managed vector or
pems.element, if available. If missing, error
handling is by checkIfMissing. See
check... for more details.)
pemsData returns the data component of a
supplied pems object as a data.frame.
getPEMSData returns the data component of
a supplied pems object as a data.frame.
pemsConstants returns the constants component
of a supplied pems object as a list.
getPEMSConstants returns the constants
component of a supplied pems object as a
list.
pemsHistory returns the history component of
a supplied pems object as a list.
cpe turns the concatenated form of supplied
input.
Note
pems... functions are in development pems
object handlers. They are intended for
convenient 'front of house' use. As part of this role,
their structure will evolve over time,
so arguments and operations may change based on user
feedback. Those wishing to develop
future-proof third party functions should also
consider check... functions when developing
their code. See common.calculations
for some Examples.
getPEMS... functions are a revision of earlier
pems... pems object handlers.
They are intended to replace pems... code in
future package versions.
rlang and dplyr functions now do
the heavy lifting for getPEMSElement.
Author(s)
Karl Ropkins
References
rlang and dplyr package functions now
do the heavy lifting for getPEMSElement.
Lionel Henry and Hadley Wickham (2018). rlang: Functions for Base Types and Core R and 'Tidyverse' Features. R package version 0.2.0. https://CRAN.R-project.org/package=rlang
Hadley Wickham, Romain Francois, Lionel Henry and Kirill Muller (2017). dplyr: A Grammar of Data Manipulation. R package version 0.7.4. https://CRAN.R-project.org/package=dplyr
See Also
See Also: check... for
check... function equivalents;
pems.generics for pems object
generic functions.
Examples
###########
##example 1
###########
#basic usage
#using example data pems.1
#(supplied as part of pems.utils package)
#pems structure
pems.1
# extracting the pems.1 element velocity
getPEMSElement(velocity, pems.1)
## Not run:
#generic (SE) equivalents
pems.1$velocity
pems.1["velocity"]
## End(Not run)
Generic handling of pems objects
Description
pems objects can be manipulated using generic functions like print, plot and summary in a similar fashion to objects of other R classes.
Usage
## S3 method for class 'pems'
as.data.frame(x,...)
## S3 method for class 'pems'
dim(x, ...)
## S3 method for class 'pems'
x$name, ...
## S3 replacement method for class 'pems'
x$name, ... <- value
## S3 method for class 'pems'
x[i, j, ..., force = FALSE, simplify = TRUE]
## S3 replacement method for class 'pems'
x[i, j, ..., force = FALSE] <- value
## S3 method for class 'pems'
x[[k, ...]]
## S3 replacement method for class 'pems'
x[[k, ...]] <- value
## S3 method for class 'pems'
with(data, expr, ...)
## S3 method for class 'pems'
subset(x, ...)
## S3 method for class 'pems'
names(x, ...)
## S3 replacement method for class 'pems'
names(x, ...) <- value
## S3 method for class 'pems'
print(x,..., rows=NULL, cols=NULL, width=NULL)
## S3 method for class 'pems'
plot(x, id = NULL, ignore = "time.stamp", n = 3, ...)
## S3 method for class 'pems'
head(x, n = 6, ...)
## S3 method for class 'pems'
tail(x, n = 6, ...)
## S3 method for class 'pems'
summary(object, ...)
## S3 method for class 'pems'
na.omit(object, ...)
## S3 method for class 'pems'
units(x)
## S3 replacement method for class 'pems'
units(x) <- value
Arguments
x, object, data |
(An Object of pems class). For direct use with |
name |
Element name, which operates in a similar fashion to |
i, j |
Row and column (elements) indices, which operate as a stricter version of
|
k |
Structural indices. See Note below. |
expr |
(Expression) For |
value |
(vector, data.frame or pems) An object to be inserted into a |
... |
Addition options, typically passed to associated default method(s). |
force |
(Logical or character) Data element handling options. |
simplify |
(Logical) |
id, ignore |
(local plot parameters). |
rows, cols, width |
(numerics, optional). For |
n |
(various). For |
Value
Generic functions provide appropriate (conventional) handling of objects of
'pems' class:
as.data.frame(pems) extracts the data.frame component of a
pems object.
dim(pems) extracts the dimensions, row count and column count,
respectively, of the data.frame component of a pems object. The
function also allows nrow(pems) and ncol(pems).
pems$name extracts the named element from a pems objects
in a similar fashion to data.frame$name. Likewise,
pems$name <- value inserts value into a pems objects
in a similar fashion to data.frame$name <- value.
pems.object[i, j] extracts the [i,j] elements of the data held in a
pems object. This is returned as either a pems or pems.element
object depending on the dimension of the extracted data and the simplify
setting.
pems.object[i, j]<- insert value into the [i,j] region of the supplied
pems object. By default this action is strict and mismatching pems[i, j]
and value dimension produce an error, although mismatching insertions may be
forced using the force argument.
pems.object[[k]] extracts structural elements of a pems object:
data, the data.frame; units the unit table, etc.
with(pems.object, expression) evaluates the supplied expression
using the elements of the supplied pems.object.
subset(pems.object, expression) behaves like
subset(data.frame, expression).
print(pems.object) provides a (to console) description of a pems
object. This forshortens large datasets in a similar fashion to a tibble.
plot(pems.object) generates a standard R plot using selected data series in
a pems object.
names(pems.object) returns a vector of the names of data series held in a
pems object when used in the form names(pems) or resets names when
used in the form names(pems) <- new.names.
na.omit(pems.object) returns the supplied pems object with all rows
including NAs removed.
summary(pems.object) generates a summary report for data series held in a
pems object.
units(pems.object) extracts the units from a supplied pems object
when used in the form units(pems) or sets/resets units when used in the form
units(pems) <- new.units.
Note
The pems object is intended to be a stricter version of a standard R
data.frame. Unless the user specifically forces the operation, a pems[]
or pems[]<- call is not allowed unless it fits exactly. So, for example by default
the call pems[,1]<-10 will not place 10 in every row of column one in the
same fashion as data.frame[,1]<-10.
The logic behind this is that columns (elements) of pems objects are time-series.
So, users would want to place these exactly and avoid any unintended wrapping. The
force argument should be used in cases where data padding or wrapping operations
are required.
pems$name and pems$name<- are not are rigorously managed, so behave more
like data.frame$name and data.frame$name<- calls, although even these do
wrap by default.
pems[[]] provides access to structural components of the pems object,
e.g. pems[["data"]] extracts the data.frame component of the pems
object, pems[["units"]] extracts the units component, etc. See also
pems.structure.
Author(s)
Karl Ropkins
References
generics in general:
H. Wickham. Advanced R. CRC Press, 2014.
(Not yet fully implemented within this package.)
Examples
##example 1
##basics pems handling
#extract a subset pems object from pems.1
a <- pems.1[1:4, 1:5]
a
#indices work like data.frame
#a[x] and a[,x] recovers element/column number x
#a[x,] recovers row number x
#a["name"] and a[,"name"] recovers element/column named "name"
#a[4:5, "name"] recovers rows 4 to 5 of element/column named "name"
#a[x,y] <- z inserts z into a at row x, element y
#etc
#insert 10 in at element 3, row 2
a[2,3] <- 10
a
#replace element conc.co2 with conc.co
a["conc.co2"] <- a$conc.co
a
#Note: by default pems objects subsetting and inserting is
#more rigorous than data.frame subsetting/insertion
#for example, a[1:2, "conc.hc"] <- 8 would generate error
#because the target, a[1:2], and insert, 8, dimensions do not
#match exactly: target 2 x 1; insert 1 x 1
#By default no wrapping is applied.
#the force argument allows the user to control how mismatching
#targets and insertions are handled
#na pad target for larger insert
a[1:2, "conc.hc", force="na.pad.target"] <- 1:5
a
#Note here when the target is padded existing enteries are NOT
#overwritten if they are not declared in a[], and the next
#previously unassigned cells are used for any extra cases in
#the insert.
#wrap insert to fill hole made by a[i,j]
a[1:2, "conc.hc", force="fill.insert"] <- 8
a
#pems$name <- value is equivalent to
#pems[name, force=c("na.pad.target", "na.pad.insert")]
a$new <- 1:4
a
Generic handling of pems.element objects
Description
pems elements objects can be manipulated using generic functions like print, plot and summary in a similar fashion to objects of other R classes.
Usage
## S3 method for class 'pems.element'
x[i, ..., force = TRUE, wrap = FALSE]
## S3 replacement method for class 'pems.element'
x[i, ..., force = TRUE, wrap = FALSE] <- value
## S3 method for class 'pems.element'
as.pems(x, ...)
## S3 method for class 'pems.element'
print(x, ..., n = NULL, rows = NULL, width = NULL)
## S3 method for class 'pems.element'
plot(x, y = NULL, xlab = NULL, ylab = NULL, ...)
## S3 method for class 'pems.element'
units(x)
## S3 replacement method for class 'pems.element'
units(x) <- value
## S3 method for class 'pems.element'
summary(object, ...)
## S3 method for class 'pems.element'
round(x, ...)
Arguments
x, object |
(An Object of pems.element class). For direct use with |
i |
Element indices, which operate in a similar fashion to |
... |
Addition options, typically passed to associated default method(s). |
force, wrap |
(Logicals) Data element handling options: |
value |
(Vector) For calls in |
n, rows, width |
(Numerics) For |
y, xlab, ylab |
(other plot arguments). As with the default |
Value
Generic functions provide appropriate (conventional)
handling of objects of 'pems.elements' class:
print(pems.element) provides a (to console)
description of the supplied pems.element object.
plot(pems.element) generates a standard R plot
of the supplied pems.element.
units(pems.element) extracts the units from the
supplied pems.element.
Note
A dedicated round(pems.element) is required as
a wrapper to round.Date and round.POSIXt
handling.
Author(s)
Karl Ropkins
Examples
#the velocity pems.element in pems.1
pems.1$velocity
Merging data and pems objects
Description
Various pems.utils functions to merge data of different types.
Usage
#basic alignment
align(data1, data2, n = 0, ...)
#alignment based on correlation
cAlign(form, data1 = NULL, data2 = NULL, ...)
#alignment based on time.stamp
tAlign(form, data1, data2 = NULL, order=TRUE, ...)
#basic stacking
stackPEMS(..., key=key, ordered=TRUE)
#historical
findLinearOffset(x = NULL, y = NULL, ...)
Arguments
data1, data2 |
( |
n |
( |
... |
(Any other arguments) For |
form |
( |
order |
( |
key |
(character or NSE) For |
ordered |
( |
x, y |
(Required objects, various classes) For |
Details
The align function accepts two pems objects,
data.frame, etc, and returns a single dataset (as
a pems object) of the aligned data. An extra argument,
n, may be supplied to offset the starting row of the
second data set relative to the first. It is intended to be
used in the form:
aligned.data <- align(data1, data2) #aligned row 1-to-1
aligned.data <- align(data1, data2, 3) #row 3-to-1, etc
The cAlign function accepts a formula and up to two data
sets and returns a single data set (as a pems object) of
correlation aligned data. This uses the best fit linear offset
correlation for the elements identifed in the formula term.
It is intended to be used in the form:
aligned.data <- cAlign(name1~name2, data1, data2)
The tAlign function accepts a formula and two data sets
and returns a single data set (as a pems object) of the
time stamp aligned data. This is this done by matching entries
in the elements identifed in the formula term.
It is intended to be used in the form:
aligned.data <- tAlign(name1~name2, data1, data2)
The stackPEMS function stacks two or more pems
objects and returns a single pems object. stackPEMS
stacks using dplyr function bind_rows so handles
pems with column names that do not completely intersect.
However it also attempts to units match. It is intended to be
used in the form:
stacked.data <- stackPEMS(data1, data2)
Historical functions:
findLinearOffset is historical code.
Value
align, cAlign, tAlign, etc all return a
single object of pem class containing the aligned data
from data1 and data2.
findLinearOffset returns the best fit offset for y
relative to x.
Note
These functions are under revision and need to be handled with care.
cAlign: By default cAlign generates an alignment
plot and returns a pems object of aligned data. But it
also allows several hidden arguments to refine outputs, the
logicals plot, offset and pems, which turn
off/on plot, offset and pems reporting individually, and
output = c("plot", "offset", "pems") or combinations thereof
also provides a single argument alternative.
bindPEMS: The historical function bindPEMS has
been superceded by align.
findLinearOffset: findLinearOffset is currently
retained but will most likely be removed from future versions of
pems.utils.
The call cAlign(x~y, output = "offset") is equivalent to
findLinearOffset(x, y).
Author(s)
Karl Ropkins
References
align uses the dplyr function full_join.
cAlign function uses the stats function ccf.
tAlign uses the dplyr function full_join.
See Also
See also: cbind for standard column binding in R;
dplyr for full_join.
Examples
###########
##example 1
###########
##data vector alignment
#make two offset ranges
temp <- rnorm(500)
x <- temp[25:300]
y <- temp[10:200]
#plot pre-alignment data
plot(x, type="l"); lines(y, col="blue", lty=2)
#estimated offset
findLinearOffset(x,y)
#[1] -15
#applying linear offset
ans <- align(x, y, findLinearOffset(x,y))
names(ans) <- c("x", "y")
#plot post-alignment data
plot(ans$x, type="l"); lines(ans$y, col="blue", lty=2)
#shortcut using cAlign
## Not run:
plot(x, type="l"); lines(y, col="blue", lty=2)
ans <- cAlign(x~y)
plot(ans$x, type="l"); lines(ans$y, col="blue", lty=2)
## End(Not run)
###########
##example 2
###########
##aligning data sets
##(pems object example)
#make some offset data
p1 <- pems.1[101:200, 1:5]
p2 <- pems.1[103:350, 1:3]
#correlation alignment using ccf
ans <- cAlign(~conc.co, p1, p2)
#this aligns by comparing p1$conc.co and p2$conc.co
#and aligning at point of best linear regression fit
## Not run:
#compare:
cAlign(~conc.co, p2, p1)
cAlign(conc.co2~conc.co, p1, p2)
#(aligns using p1$conc.co2 and p2$conc.co)
cAlign(conc.co2~conc.co, p1)
#(realigns just conc.co within p1 based on best fit
# with conc.co2 and returns as output ans)
#time stamp alignment
tAlign(~time.stamp, p1, p2)
#this aligns by pairing elements in p1$time.stamp
#and p2$time.stamp
#(if time stamps have different names
# tAlign(time1~time2, p1, p2), the time stamp name
# from p1 would be retained when merging p1$time1
# and p2$time2, generating [output]$time1)
## End(Not run)
###########
##example 3
###########
##stacking pems
#make some offset data
p1 <- pems.1[1:2, 1:4]
p2 <- pems.1[3, 2:4]
p3 <- pems.1[4:6, 1:3]
#stack
stackPEMS(p1, p2, p3, key=source)
Data Referencing Functions.
Description
Various functions for grouping, subsetting, filtering and conditioning datasets.
Usage
refRow(ref = NULL, n = 4, breaks = NULL,
data = NULL, ..., labels = NULL,
fun.name = "refRow")
refX(ref = NULL, n = 4, breaks = NULL,
method = "percentile",
data = NULL, ..., labels = NULL,
fun.name = "refX")
refEngineOn(rpm = NULL, data = NULL,
threshold = 200, ..., labels = NULL,
fun.name = "refEngineOn")
refDrivingMode(speed = NULL, accel = NULL,
time = NULL, data = NULL,
threshold.speed = 0.1,
threshold.accel = 0.1,
..., labels = NULL,
fun.name = "refDrivingMode")
Arguments
ref |
(Data series, typically vector) The reference data-series to consider when making a vector of subset markers/indices. See Details. |
n, breaks |
(numerics) With |
data |
(Optional |
... |
(Optional) Other arguments, currently passed on to
|
labels |
(Vector, typically Character) a vector of labels to be assigned to the reference regions. |
fun.name |
(function managment argument) |
method |
(Various) For |
rpm |
For |
threshold |
For |
speed, accel, time |
For |
threshold.speed, threshold.accel |
For |
Details
ref... functions generate a vector
of subset markers or indices based of the referencing
method applied and the length of ref.
See Value regarding outputs.
refRow assigns reference regions based on row
number. Because row depends on the length of the
ref element independent of values, this is a
unique case where ref can be either a vector or
a data set (pems, data.frame). It accepts
n to set the number of cases to make or
breaks to set break-points at specific rows.
refX assigns reference regions based on the value
of a supplied data-series.It accepts n to set the
number of cases to make or breaks to set the
ref values to make break-points. If using n,
method used to assign cut method, e.g.
'percentile' or 'range'.
refEngineOn assigns reference regions based on
engine operation status. It uses the input, which it assumes
is engine speed, and assumes reported engine speeds larger
than the supplied threshold, by default 200 rpm, indicate
that the engine is on.
refDrivingMode assigns reference regions based on
vehicle driving mode. It uses inputs, assumed to be
speed, accel and/or accel, and
associated threshold to characterize activity as
decel, idle, cruise or accel.
Value
By default results are returned as
pems.elements.
The reference vector generated by ref...
functions can then be used to group, subset, filter
or condition data in pems objects.
refRow assigns reference according to row number,
and, by default, reference labels show start row and
end row of the referenced case.
refX assigns reference according to value of supplied
input, and, by default, reference labels show
lower value and higher value of the referenced
case.
refEngineOn assigns reference according to engine
operation status based on engine speed, and, by default,
reference labels are 'on' or 'off'.
refDrivingMode assigns reference according to vehicle
driving mode, based on vehicle speed, acceleration and
associated thresholds, and, by default,
reference labels are decel, idle,
cruise and accel.
Note
With refRow, If n is applied and the length
of ref is not exactly divisible by n
a best attempt is made.
With refX, if breaks are at values that are
duplicated, all same values are assigned to the same (lower)
value case, so e.g. 'percentile' may vary significantly
if break-point values are highly duplicated in ref
Author(s)
Karl Ropkins
References
References in preparation.
See Also
cut, etc. in the main R package.
Examples
###########
##example 1
###########
#basic usage
#working with a temporary pems
temp <- pems.1
#cut into equal subsets
temp$ref <- refRow(velocity, n= 5, data=temp)
pemsPlot(local.time, velocity, cond=ref, data=temp,
type="l", layout=c(1,5))
#cut at three points
temp <- pems.1
temp$ref <- refRow(velocity, breaks=c(180,410,700),
data=temp)
pemsPlot(local.time, velocity, cond=ref, data=temp,
type="l", layout=c(1,5))
pems Data Time Handlers
Description
Time handlers are subset of pems.utils functions that
work on or with time records (time.stamp and
local.time).
Usage
regularize(data, Hz=1, method=1, ...)
repairLocalTime(data, local.time, ref, ..., reset.count = TRUE,
fun.name = "repairLocalTime")
Arguments
data |
(Required, typically |
Hz |
(For |
method |
(For |
... |
(Optional) Other arguments, typically passed on. |
local.time |
(For |
ref, reset.count |
(For |
fun.name |
( |
Details
regularize attempts to extrapolate a regular series, generated at the
time resolution requested, from the supplied data. Both methods can
be used for the regularization of irregularly time-logged data, but differ
in their data handling. Method 1 estimates measurements at regular
intervals by linearly interpolating between the last valid point and the next
valid point in supplied time-series. It therefore hole-fills gaps in
time-series and is perhaps best suited for use with sparser data-sets. It
can also be used to interolate time-series to higher time-resolutions, but
should not be used aggressively, e.g. to convert 1Hz data data to 10Hz. By
contrast, method 2 uses data binning to aggregate all supplied
measurements (e.g. all measurements between -0.5 and +0.5 seconds of requested
times when returning 1 Hz data) and (mean) average these. It is better suited
for use with higher resolution time-series (e.g. gong from about 10Hz to 1Hz)
and does not hole-fill empty time intervals. If you want mean binning and
hole-filling, apply method 2 then method 1, e.g.:
new.data <- regularize(regularize(my.data, method=2), method=1)
repairLocalTime attempts to repair an incomplete local.time
record. For example, if you merge two datasets with overlapping but
different time ranges, one may not track the time range of the other and
this can generate incomplete time records. This function attempts to
hole-fill such cases.
Value
regularize returns the supplied dataset (data) with time-series
(time.stamp and local.time) are regularized at the
requestion time resolution, based on Hz value. It uses
approx or data binning to estimate associated changes for other
data-series.
repairLocalTime returns a repaired local.time
pem.element, typically the supplied local.time with
any holes (NAs) it can fill filled.
Note
All time handlers should be used with care.
Author(s)
Karl Ropkins
References
regularize(..., method=1) uses approx:
Base R Stats package function based on Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
A lot of leg-work testing regularize was done by then Leeds
MSc Student Adrian Felipe Ortega Calle.
See Also
approx regarding data regularization methods.
data unit handlers
Description
Various pems.utils functions for the management of data units.
Usage
getUnits(input = NULL, data = NULL, ...,
if.missing = c("stop", "warning", "return"))
setUnits(input = NULL, units = NULL, data = NULL, ...,
if.missing = c("stop", "warning", "return"),
output = c("input", "data.frame", "pems", "special"),
force = FALSE, overwrite = FALSE)
convertUnits(input = NULL, to = NULL, from = NULL, data = NULL, ...,
if.missing = c("stop", "warning", "return"),
output = c("input", "data.frame", "pems", "special"),
unit.conversions = NULL, force = FALSE, overwrite = FALSE)
#local unit.conversion method handling
addUnitConversion(to = NULL, from = NULL, conversion = NULL,
tag = "undocumented",
unit.conversions = ref.unit.conversions, ...,
overwrite = FALSE)
addUnitAlias(ref = NULL, alias = NULL,
unit.conversions = ref.unit.conversions, ...)
listUnitConversions(unit.conversions = ref.unit.conversions, ...,
verbose = FALSE, to = NULL, from = NULL)
Arguments
input |
(vector, object or object element) An input, e.g. a vector of speed measurements. |
data |
(data.frame, pems object) If supplied, the assumed source for an |
units, to, from, ref, alias, tag |
(Character vectors). Unit ids. |
... |
(Optional) Other arguments, currently ignored. |
if.missing |
(Optional character vector) What the function should do if things do not go as expected. Current
options include: |
output |
(Character vector) Output mode for function results. Options currently include: |
force |
(Logical) Should a unit change to attempted even if checking indicates a mismatch, e.g. an attempt to
set the units of an |
overwrite |
(Logical) If 'same name' cases are encountered when packing/repacking an |
unit.conversions |
(Optional list) If supplied, |
conversion |
(Numeric or function) When adding or updating a conversion method using |
verbose |
(Logical) For |
Details
getUnits returns the units of an input.
setUnits sets/resets the units of an input.
convertUnits converts the units of an input.
addUnitConversion adds a conversion method to a local version
of the unit conversion look-up table. Methods should be supplied as
to and from unit ids and an associated conversion.
A tag can also be supplied to provide a more detailed description
of the conversion for use in documentation.
addUnitAlias adds an alias for an existing unit id in a local version
of the unit conversion look-up table. The existing unit id should be identified
using ref and the new alias should be assinged using alias. The
alias is added to all to and from elements containing
ref to allow users to work with alternative unit abbreviations.
listUnitConversions lists the methods a supplied unit conversion look-up table.
If to and/or from arguments are also supplied, these are used to
subsample relevant methods.
Value
getUnits returns the units of an input as a character vector if available,
else it returns NULL.
setUnits sets the units of an input to a supplied value, units, if they have
not already be set or if force = TRUE. The result is returned as the modified input alone,
the modified input as an element in a data.frame, or the modifed input as
an element in a pems object (depending on output setting). If either a
data.frame or pems object is supplied as data, this is used as the target
when repacking the output. (Note: output = "special" is a special case which allows the
function to select the output mode based on the type of data supplied.
convertUnits converts the units of an input. Typically, this is done by setting the
required new units, using to, and letting the function select a suitable conversion method. However,
conversions can be forced by setting from and force = TRUE to apply a specifc
to/from method to an input regardless of the actual units of input.
As with setUnits, results can be output as input, data.frame or pems
objects.
addUnitConversion returns a supplied unit conversion look-up table (or in its absence the reference
ref.unit.conversions) subject to the requested addition or update. Note: modifications that change
exist information require the extra argument overwrite = TRUE as confirmation.
addUnitAlias returns a supplied unit conversion look-up table (or in its absence the reference
ref.unit.conversions) subject to the requested alias addition.
listUnitConversions returns summary descriptions of methods in the supplied unit conversion look-up
table (or in its absence the reference ref.unit.conversions). Additional arguments, to and
from, can be used to select unit conversions of particular relevance.
Note
This set of functions is intended to provide a flexible framework for the routine handling of data units.
Author(s)
Karl Ropkins
References
References in preparation
See Also
Examples
###########
##example 1
###########
#work with data units
#getting units (where assigned)
getUnits(velocity, pems.1) #km/h
#setting units
a <- 1:10
a <- setUnits(a, "km/h") #add unit
#alternaltive
#using pems.element
#a <- pems.element(a, units="km/h", name = "a")
#changing units
convertUnits(a, "mi/h")
# [1] 0.6213712 1.2427424 1.8641136 2.4854848 3.1068560 3.7282272 4.3495983
# [8] 4.9709695 5.5923407 6.2137119
# pems.element; [unnamed] [mi/h] [n = 10]
###########
##example 2
###########
#working with local unit conversions
#adding/updating unit conversion methods
#make a local reference
ref.list <- ref.unit.conversions
#add a miles/hour alias to mi/h
ref.list <- addUnitAlias("mi/h", "miles/hour", ref.list)
#add a new conversion
ref.list <- addUnitConversion(to = "silly", from = "km/h",
conversion = function(x) 12 + (21 * x),
tag = "kilometers/hour to some silly scale",
unit.conversions = ref.list)
#use these
convertUnits(a, "miles/hour", unit.conversions = ref.list)
# [1] 0.6213712 1.2427424 1.8641136 2.4854848 3.1068560 3.7282272 4.3495983
# [8] 4.9709695 5.5923407 6.2137119
# units: "miles/hour" (as above but using your unit abbreviations)
convertUnits(a, "silly", unit.conversions = ref.list)
# [1] 33 54 75 96 117 138 159 180 201 222
# units: "silly" (well, you get what you ask for)
Various plots for pems.utils
Description
Various plot functions and visualization tools
for use with pems objects.
Usage
#pemsPlot
pemsPlot(x, y = NULL, z = NULL, groups = NULL,
cond = NULL, ..., data = NULL,
units = TRUE, multi.y = "special",
fun.name="pemsPlot")
#associated functions
pemsXYZCondUnitsHandler(x, y = NULL, z = NULL,
cond = NULL, groups = NULL, data = NULL,
units = TRUE, ...,
fun.name = "pemsXYZCondHandler")
preprocess.pemsPlot(lattice.like = lattice.like,
units = units, ...)
panel.pemsPlot(..., loa.settings = FALSE)
panel.routePath(..., loa.settings = FALSE)
#WatsonPlot
WatsonPlot(speed, accel = NULL, z = NULL, ...,
data = NULL, cond = NULL, units = TRUE,
plot.type = 2, fun.name="WatsonPlot")
#associated functions
preprocess.WatsonPlot(lattice.like = lattice.like, ...)
panel.WatsonBinPlot(..., ref.line = TRUE,
process.panel = NULL, plot.panel = NULL,
omit.stopped = FALSE, process = TRUE,
plot = TRUE, loa.settings = FALSE)
panel.WatsonContourPlot(...,
plot.panel=NULL, process = TRUE,
plot = TRUE, loa.settings = FALSE)
panel.WatsonSmoothContourPlot(...,
plot.panel=NULL, process = TRUE,
plot = TRUE, loa.settings = FALSE)
#old plots
latticePlot(x = NULL, data = NULL, plot = lattice::xyplot,
panel = NULL, ..., greyscale = FALSE,
fun.name = "latticePlot")
panel.PEMSXYPlot(..., grid=NULL)
XYZPlot(x = NULL, ..., data = NULL, statistic = NULL,
x.res = 10, y.res = 20, plot = lattice::levelplot,
fun.name = "XYZPlot")
Arguments
x, y, z, groups, cond |
(Various) The main plot elements. For new plots, these should be supplied individually,
e.g. for
For old plots, these must be formulae. For For See Notes and Examples. |
data |
(Optional |
units |
(Optional |
multi.y |
(character) |
... |
(Optional) Other arguments, typically passed on. This
includes, |
fun.name |
(Function management argument) |
panel, plot.panel, process.panel |
(Functions) These functions are used to generate
the content of individual plot panels.
Typically, all in-panel data processing and plotting
is carried out using |
lattice.like, plot, process, loa.settings |
(Various) Plot management elements. These can typically be ignored by most users, but allow plot developers to fine-tune plots. See Details below. |
speed, accel |
(Various) For |
ref.line |
(Logical or list) For |
omit.stopped |
(Logical or character) For |
plot.type |
(numeric) For |
greyscale |
(Logical) For older plots only, should the plot
be greyscale by default? This option resets
the |
grid |
(List) If supplied, a list of plot parameters to be used to control the appearance of the grid component of the plot. See Below. |
statistic |
(Function) when binning data with |
x.res, y.res |
(Numerics) when binning data with |
Details
pems.utils includes conventional (generic)
plot methods for pems and
pems.element objects. See
plot.pems and
plot.pems.element for further
details.
However, it also includes a range of higher-level
plotting functions developed for use with
pems data.
Early plots, e.g. latticePlot, only allowed
plot arguments using the
lattice formula format. While this is
flexible and very powerful system, some users
preferred the more conventional plot(x,y,..)
call format.
So, newer plots, e.g. pemsPlot, allow both
conventional plot and
lattice-style formula calls.
pemsXYZCondUnitsHandler handles the pems
information associated with the plots. This
routine is included as a discrete function within
this package and others are welcome to
use elsewhere for similar purposes.
edit(pemsPlot) to see it.
Newer plots use a combination of lattice
and loa functions to provide a range of
additional plotting options, such as integrated panel
and key management. See loa
documentation for further details.
preprocess... and panel... functions
handle pre-plot and in-plot elements
of plot generation. These use the loa
modification of the lattice
plotting framework.
See Notes, Examples and extra documentation: pems.plots.
Value
By default, pemsPlot generates a bubble plot,
so it plots (x,y) points, and by default
color-grades and size-scales them according to
z if also supplied.
When supplied speed and accel data-series as
x and y cases, the WatsonPlot
generates various forms of Watson's classic
speed/accel frequency distribution
plot.
latticePlot and XYZPlot are general
purpose 'xy' and 'xyz' data plotting functions.
fortify is intended for use by ggplot2
functions when users are plotting data in
pems objects. See Notes.
Warning
IMPORTANT: Conditioning is currently disabled on
XYZPlot.
XYZPlot is a short-term replace for
previous function quickPlot. It will most
likely be replaced when pems.utils.0.3 is
released.
pemsPlot and WatsonPlot no longer
accept formula x, y, z inputs.
With all these functions I have tried to make the default plotting options as robust as possible. However, it is not always possible to test all the plot combines that users might try. So, please let me know if anything is not working nicely for you. Thanks.
Note
General:
Like most other plot functions in R,
lattice functions use a number
of common parameter terms. For example, xlab
and ylab reset the x and y labels of a graph;
xlim and ylim to set the x- and
y-scales of a graph; col sets the color of a
plot element; type sets the type ('p' for
points, 'l' for lines, etc); pch and
cex set plot symbol type and size, respectively;
and, lty and lwd set plot line type and
thickness, respectively; etc. These terms are passed
onto and evaluated by all these plot functions to
provide standard plot control.
latticePlot:
The default plot option for latticePlot
is xyplot.
panel options for latticePlot: Default
panel.xyplot. The alternative panel,
panel.PEMSXYPlot supplied as part of this
package, adds a grid layer to a standard xy panel.
The extra code just allows you to pass specific plot
parameters to the grid panel using the argument
grid. You can build almost any plot layout
using these and other panels in lattice and
loa as building blocks.
XYZPlot:
The default plot option for latticePlot
is levelplot.
pemsPlot:
pemsPlot and subsequent plot functions use an
alternative convention. Here, plots include
separate process and plot steps.
This option allows the plot to pass on share the
results of in-panel calculations with other panels
and keys. The handling mechanism is part of the
loa package.
The reason for latticePlot, etc:
latticePlot combines a number of
lattice and latticeExtra function
modifications I regularly use when plotting data.
So, it is basically a short cut to save having to
write out a lot of code I regularly use. I would
encourage anyone to at the very least have a look
at lattice.
I also hope those learning lattice, find
these functions a helpful introduction and handy
'stop gap' while they are getting to grips with
the code behind trellis and panel structures.
Author(s)
Karl Ropkins
References
lattice:
Sarkar, Deepayan (2008) Lattice: Multivariate Data Visualization with R. Springer, New York. ISBN 978-0-387-75968-5
latticeExtra:
Deepayan Sarkar and Felix Andrews (2011). latticeExtra: Extra Graphical Utilities Based on Lattice. R package version 0.6-18. http://CRAN.R-project.org/package=latticeExtra
lattice is one of number of really
nice graphical tools in R. Others, like
ggplot2 and iplot, help you to very
quickly explore your data. But, for me the trellis
framework of lattice
has always felt the most flexible.
See Also
See lattice, latticeExtra,
loa.
Examples
###########
##example 1
###########
## Not run:
#plotting pems with other packages
#base
plot(pems.1)
plot(pems.1$velocity)
#with lattice
require(lattice)
xyplot(velocity~local.time, data = pems.1, type = "l")
#with ggplot2
require(ggplot2)
qplot(time.stamp, velocity, data=pems.1)
ggplot(pems.1, aes(x = time.stamp, y = velocity)) + geom_line()
#etc
## End(Not run)
###########
##example 2
###########
#basic usage of latticePlot
latticePlot(velocity~local.time, data = pems.1, type = "l")
latticePlot(velocity~local.time, data = pems.1, col = "red",
pch = 20, panel = panel.PEMSXYPlot,
grid = list(col ="black", lty=2))
###########
##example 3
###########
#basic usage of XYZPlot
a <- calcAccel(velocity, local.time, data = pems.1, output="pems")
XYZPlot(~accel*velocity, data=a)
XYZPlot(~accel*velocity, data=a, plot = lattice::wireframe, shade=TRUE)
###########
##example 4
###########
#basic usage of pemsPlot
pemsPlot(local.time, velocity, data=pems.1, type="l")
###########
##example 5
###########
#basic usage of WatsonPlot
#Note: using 'a' generated in example 3
WatsonPlot(velocity, accel, data=a)
## Not run:
#omit.stopped for different handling of idling data
WatsonPlot(velocity, accel, data=a, omit.stopped="points")
WatsonPlot(velocity, accel, data=a, omit.stopped="cells")
#plot.type for different plot methods
WatsonPlot(velocity, accel, data=a, plot.type=1)
WatsonPlot(velocity, accel, data=a, plot.type=2)
WatsonPlot(velocity, accel, data=a, plot.type=3)
WatsonPlot(velocity, accel, data=a, plot.type=4)
## End(Not run)
Common calculations
Description
Various common calculations associated with PEMS data.
Usage
calcDistance(speed = NULL, time = NULL, data = NULL,
..., fun.name = "calcDistance")
calcSpeed(distance = NULL, time = NULL, data = NULL,
..., fun.name = "calcSpeed")
calcAccel(speed = NULL, time = NULL, data = NULL,
..., method = 2, fun.name = "calcAccel")
calcAcceleration(speed = NULL, time = NULL, data = NULL,
..., method = 2, fun.name = "calcAccel")
calcJerk(accel = NULL, time = NULL, data = NULL,
..., fun.name = "calcJerk")
#associated
calcChecks(fun.name = "calcChecks", ..., data = NULL,
if.missing = c("stop", "warning", "return"),
output = c("input", "data.frame", "pems", "special"),
unit.conversions = NULL, overwrite = FALSE)
calcPack(output = NULL, data = NULL, settings = NULL,
fun.name = "calcPack", this.call = NULL)
Arguments
speed, time, distance, accel |
(Required data series typically vectors) The inputs to use when doing a calculation. These
can typically be vectors or elements in either a |
data |
(Optional |
... |
(Optional) Other arguments, currently passed on to |
fun.name |
(Optional character) The name of the parent function, to be used in error messaging. |
if.missing, output, unit.conversions, overwrite, settings, this.call |
(Various) Along with |
method |
(Character) Currently for |
Details
With the exception of calcChecks and calcPack, calc... functions
are common calculations.
calcDistance calculates distance (in m) using speed and time.
calcSpeed calculates speed (in m/s) using distance and time.
calcAccel calculates acceleration (in m/s/s) using speed and time.
calcJerk calculates jerk (rate of change of acceleration in m/s/s/s) using
acceleration and time.
By default results are returned as pems.elements. Other options include
returning as the supplied data plus the results as either a data.frame or a
pems object. See Note below.
Unit management is by convertUnits. See Note below.
The extra functions calcChecks and calcPack are add-ins that anyone can use
to develop other similiar functions. They are added at the start and end of standard
calc... functions to provide an option to use with third-party code. See Note.
Value
With the exception of calcChecks and calcPack, all calc... functions
return either a pems.element vector, data.frame or pems object, depending
on output setting and data supplied.
Note
Unit handling in pems.utils is via checkUnits, getUnits,
setUnits and convertUnits. Allowed unit conversion methods have
to be defined in ref.unit.conversions or a locally defined alternative supplied
by the user. See convertUnits for an example of how to locally work with unit
conversions.
calc.dist and calc.accel are alternatives to calcDistance and calcAccel.
The functions calcChecks and calcPack are currently under revision and likely to be
replaced in future versions of pems.utils.
Author(s)
Karl Ropkins
References
References in preparation.
See Also
calcVSP for VSP calculations. calcEm for emissions calculations.
Examples
###########
##example 1
###########
#basic usage
#calculated accel as pems.element
calcAccel(velocity, local.time, pems.1)
#answer returned as suppied pems + calculated accel
calcAccel(velocity, local.time, pems.1, output = "pems")
#or, if you would rather...
## Not run:
pems.1$accel <- calcAccel(velocity, local.time, pems.1)
## End(Not run)
###########
#example 2
###########
#making wrappers for routine data processing
my.pems <- list(pems.1, pems.1)
sapply(my.pems, function(x)
calcAccel(velocity, local.time, data=x))
#ans = accel data series for each pems in my.pems list
# [,1] [,2]
# [1,] NA NA
# [2,] 0.00000000 0.00000000
# [3,] 0.05555556 0.05555556
# [4,] 0.00000000 0.00000000
# [5,] -0.02777778 -0.02777778
# [6,] 0.05555556 0.05555556
# ....
#note:
#sapply if you can/want to simiplify outputs
#lapply if you want to keep output as a list of answers
common check... functions
Description
Various pems.utils workhorse functions for input checking and routine data handling.
Usage
checkOption(option=NULL, allowed.options=NULL,
option.name = "option", allowed.options.name = "allowed.options",
partial.match=TRUE, fun.name = "checkOption",
if.missing = c("stop", "warning", "return"),
output = c("option", "test.result"), ...)
checkPEMS(data = NULL, fun.name = "checkPEMS",
if.missing = c("return", "warning", "stop"),
output = c("pems", "data.frame", "test.result"),
...)
checkUnits(input = NULL, units = NULL, data = NULL,
input.name = NULL, fun.name = "checkUnits",
if.missing = c("stop", "warning", "return"),
output = c("special", "units", "input", "test.result"),
..., unit.conversions = NULL)
checkOutput(input = NULL, data = NULL,
input.name = NULL, fun.name = "checkOutput",
if.missing = c("stop", "warning", "return"),
output = c("pems", "data.frame", "input", "test.result"),
overwrite = FALSE, ...)
checkIfMissing(..., if.missing = c("stop", "warning", "return"),
reply = NULL, suggest = NULL, if.warning = NULL,
fun.name = NULL)
Arguments
input |
(vector, object or object element) An input to be tested or recovered for
subsequent use by another function, e.g. a speed measurement from a |
data |
(data.frame, pems object) If supplied, the assumed source for an |
input.name, option.name |
(Optional character vectors) If a |
fun.name |
(Optional character vector) If a |
if.missing |
(Optional character vector) How to handle an input, option, etc, if missing, not supplied or |
output |
(Character vector) Output mode for |
... |
(Optional) Other arguments, currently ignored by all |
option, allowed.options, allowed.options.name |
(Character vectors) For |
partial.match |
(Logical) For |
units |
(Character vector) For |
unit.conversions |
(List) For |
overwrite |
(Logical) For |
reply, suggest, if.warning |
(Character vectors) For |
Details
The check... functions are intended as a means of future-proofing pems.utils data
handling. They provide routine error/warning messaging and consistent 'front-of-house' handling
of function arguments regardless of any underlying changes in the structure of the pems
objects and/or pems.utils code. This means third-party function developed using these
functions should be highly stable.
checkOption checks a supplied option against a set of allowed options, and then if present or
matchable returns the assigned option. It is intended as a workhorse for handling optional function
arguments.
checkPEMS checks a supplied data source and provides a short-cut for converting this
to and from data.frames and pems object classes. It is intended as a 'best-of-both-worlds'
mechanism, so users can supply data in various different formats, but function developers only
have to work with that data in one (known) format.
checkUnits checks the units of a previously recovered input, and then, depending on the
output setting, returns either the units of the input or the input in the
required units (assuming the associated conversion is known).
checkOutput packs/repacks a previously recovered input. Depending on the output setting, this
can be as the (standalone) input, an element of a data.frame or an element of a pems object.
checkIfMissing if a workhorse function for the if.missing argument. If any of the supplied
additional arguments are NULL, it stops, warns and continues or continues a parent function according to
the if.missing argument. If supplied, reply, suggest and if.warning arguments are
used to generate the associated error or warning message.
Value
All check... functions return a logical if output = "test.result", TRUE
if the input, option, etc., is suitable for use in that fashion or FALSE if not.
Otherwise,
checkOption return the option argument if valid (on the basis of if.missing) or an
error, warning and/or NULL (on the basis of if.missing) if not. If partial.match = TRUE
and partial matching is possible this is in the full form given in allowed.options regardless of
the degree of abbreviation used by the user.
checkPEMS returns the data argument if valid or an error, warning and/or NULL (on the basis
of if.missing) if not. Depending on output setting, the valid return is either a data.frame
or pems object.
checkUnits returns the units of the input argument if no other information is supplied and
units have previously been assigned to that input. If units are assigned in the call
or output is forced (output = "input"), the input is returned in the requested
units. If this action is not possible (e.g. pems.utils does not know the conversion), the
function returns an error, a warning and the unchanged input or the unchanged input alone
depending on if.missing setting.
Depening on if.missing argument, checkIfMissing either stops all parent functions with an error
message, warns of a problem but allows parent functions to continue running, or allows parent functions to
continue without informing the user.
Note
The ...name arguments allow the check... functions to be used silently.
If a parent function is identified as fun.name and the check case (input,
option, etc.) is identified with the associated ...name argument these are
used in any associated error messaging.
Author(s)
Karl Ropkins
References
[TO DO]
See Also
See ref.unit.conversions and convertUnits for general unit handling.
Corrections
Description
Corrections are a special subset of functions which by default write over the elements that they recalculate.
Usage
correctInput(input = NULL, ..., data = NULL,
correction = NULL)
zeroNegatives(input = NULL, ..., data = NULL,
screen = FALSE)
correctBaseline(x, ..., data = NULL, output = "ans")
#associated
calcPack2(input, ..., settings = NULL, data = NULL)
Arguments
input |
(Required data series typically vectors) The input to use when makin a correction. This
is typically a vector or element in either a |
x |
(For |
... |
(Optional) Other arguments, typically passed on. |
data |
(Optional |
correction |
(For |
screen |
(For |
output |
(character) Where options exists for the function output, the required output. For
|
settings |
(For |
Details
correctInput is a general correction handlers. It accepts an
input and a function, correction, which it applies to
input.
zeroNegatives resets any negative values in an input to
zero.
correctBaseline attempts to correct the baseline of a supplied data
(pems.element vector) time-series. Baseline corrections are
carried out using methods from the baseline package. See Below.
calcPack2 is an alternative version of calcPack. See
associated help for details.
Value
With the exception of calcPack2, all the above functions generate
input corrections.
correctBaseline returns the supplied data time-series (x)
after applying the requested baseline correction (see below).
Note
By default, corrections return results in the format of the input. So: If
inputs are supplied as vectors, the answer is returned as a vector; If inputs are
supplied in a pems object, that pems object is returned with the answer
added in. This behaviour is enabled by the default output = "special". Output
type can be forced by declaring ouput in the function call. Options
"input", "data.frame" and "pems" return vectors, data.frames and
pems objects, respectively.
Unlike other calculations, corrections automatically replace the associated
input, unless prevented (using overwrite = FALSE).
This function management is handled by calcChecks and
calcPack. These are front and back end calc...
function add-ins that anyone can use as a 'minimal code' means of
integrating third-party and pems.utils functions.
See calcChecks documentation for details.
correctBaseline is a recent transfer from sleeper.service.
It uses baseline functions to provide 'best guess' baseline
corrections.
By default, it applies:
baseline(..., method="rollingBall", wm=50, ws=50)
Please Note the 'best guess': As baseline corrections are based statistical estimates of likely baselines rather than actual measures of drift these should be treated as estimates.
Unit management is by convertUnits. See associated help
documentation for details.
Author(s)
Karl Ropkins
References
baseline:
Kristian Hovde Liland and Bjorn-Helge Mevik (2015). baseline: Baseline Correction of Spectra. R package version 1.2-1. https://CRAN.R-project.org/package=baseline
See Also
baseline regarding baseline corrections.
common.calculations, calcVSP or calcEm for calculation functions.
getElement (checkUnits, etc
and convertUnits for data management.
Examples
###########
##example 1
###########
#basic usage
zeroNegatives(-10:10) #etc
Generating summary reports
Description
Various functions for generating summary reports for pems objects.
Usage
summaryReport(speed = NULL, time = NULL, accel = NULL,
distance = NULL, data = NULL, ...,
lod.speed = 0.1, lod.accel = 0.1,
fun.name = "summaryReport")
Arguments
speed, accel, time, distance |
(Data series typically vectors) The inputs to use when doing a calculation. These
can typically be vectors or elements in either a |
data |
(Optional |
... |
(Optional) Other arguments, currently passed on to |
lod.speed, lod.accel |
(numerics) The limits of detection for speed and accel measurements, respectively. [Note: if only one value is given for accel, the accel limits are assumed to be c(-lod.accel, + lod.accel)]. |
fun.name |
(Optional character) The name of the parent function, to be used in error messaging. |
Details
summaryReport does not strictly require all the arguments speed, accel, time
and distance as inputs. It calculates as many of the missing cases as it can using the
common.calculations before halting an analysis or warning the user of any problems.
Unit management is by convertUnits. See Note below.
Value
summaryReport returns a one-row data.frame with twelve elements:
distance.travelled.km this total distance travelled (in km)
time.total.s the total time taken (in s)
avg.speed.km.h the mean speed as averaged across the total journey/dataset
(in km/h)
avg.running.speed.km.h the mean speed while the vehicle was in motion (in km/h),
assuming a 0.01 km/h accuracy for speed measurements.
time.idle.s and time.idle.pc, the time the vehicle was idling (in s and as a
percentage, respectively), also assuming a 0.01 km/h cutoff for speed measurements.
avg.accel.m.s.s the mean (positive component of) acceleration (in m/s/s),
assuming a 0.1 m/s/s cutoff for accel measurements.
time.accel.s and time.accel.pc, the time the vehicle was accelerating (in s and as a
percentage, respectively), also assuming a 0.1 m/s/s cutoff for accel measurements.
avg.decel.m.s.s the mean deceleration (negative component of acceleration in m/s/s),
assuming a -0.1 m/s/s cutoff for accel measurements.
time.decel.s and time.decel.pc, the time the vehicle was decelerating (in s and as a
percentage, respectively), also assuming a -0.1 m/s/s cutoff for accel measurements.
Warning
Currently, summaryReport outputs have units incorporated into their names because the
outputs themselves are unitless data.frames.
Note
Unit handling in pems.utils is via checkUnits, getUnits,
setUnits and convertUnits. Allowed unit conversion methods have
to be defined in ref.unit.conversions or a locally defined alternative supplied
by the user. See convertUnits for an example of how to locally work with unit
conversions.
Author(s)
Karl Ropkins
References
References in preparation.
See Also
checkUnits and convertUnits for data management.
Examples
###########
##example 1
###########
#basic usage
summaryReport(velocity, local.time, data=pems.1)
# distance.travelled.km time.total.s avg.speed.km.h avg.running.speed.km.h
# 1 6.186056 1000 22.2698 28.78538
# time.idle.s time.idle.pc avg.accel.m.s.s time.accel.s time.accel.pc
# 1 40 4 0.7921279 271 27.1
# avg.decel.m.s.s time.decel.s time.decel.pc
# 1 -0.9039449 238 23.8
#apply to multiple cases
my.pems <- list(pems.1, pems.1)
sapply(my.pems, function(x)
summaryReport(velocity, local.time, data = x))
# [,1] [,2]
# distance.travelled.km 6.186056 6.186056
# time.total.s 1000 1000
# avg.speed.km.h 22.2698 22.2698
# avg.running.speed.km.h 28.78538 28.78538
# time.idle.s 40 40
# time.idle.pc 4 4
# avg.accel.m.s.s 0.7921279 0.7921279
# time.accel.s 271 271
# time.accel.pc 27.1 27.1
# avg.decel.m.s.s -0.9039449 -0.9039449
# time.decel.s 238 238
# time.decel.pc 23.8 23.8
Vehicle Specific Power (VSP) related code
Description
Functions associated with VSP calculations.
Usage
#calculation
calcVSP(speed = NULL, accel = NULL, slope = NULL,
time = NULL, distance = NULL, data = NULL,
calc.method = calcVSP_JimenezPalacios,
..., fun.name = "calcVSP", this.call = NULL)
calcVSP_JimenezPalacios(speed = NULL, accel = NULL,
slope = NULL, vehicle.weight = NULL, vsp.a = NULL,
vsp.b = NULL, vsp.c = NULL, vsp.g = NULL, ...,
data = NULL,
fun.name = "calcVSP_JimenezPalacios",
this.call = NULL)
#VSP binning
refVSPBin(..., bin.method="ncsu.14")
refVSPBin_NCSU.14(vsp = NULL, data = NULL,
..., fun.name="refVSPBin_NSCU.14")
refVSPBin_MOVES.23(vsp = NULL, speed = NULL, data = NULL,
..., fun.name="refVSPBin_MOVES.23")
#vsp plotting
VSPPlot(vsp, em = NULL, ..., data = NULL, plot.type = 1,
fun.name="VSPPlot")
VSPBinPlot(vspbin, em = NULL, ..., data = NULL,
plot.type = 1, stat = NULL, fun.name="VSPBinPlot")
Arguments
speed, accel, slope, time, distance, vsp, vspbin, em |
(Typically pems.element vectors) |
data |
(Optional, typically |
calc.method, bin.method |
(Required functions) |
... |
(Optional) Other arguments, currently passed on as supplied to associated calculation or binning method, or back to pemsPlot. |
fun.name |
(Optional character) The name of the parent function, to be used in error messaging. |
this.call |
(Optional) Initial call, should generally be ignored. See
|
vehicle.weight, vsp.a, vsp.b, vsp.c, vsp.g |
(Numerics) VSP constants. If not supplied, defaults are applied. See Below. |
plot.type |
(Optional numeric) For |
stat |
(Function) For |
Details
calcVSP... functions calculate VSP:
calcVSP is a wrapper function which allows users to
supply different combinations of inputs. VSP calculations
typically require speed, acceleration and slope inputs.
However, This wrapper allows different input combinations,
e.g.:
time and distance (time and distance -> speed, time and speed -> accel)
time and speed (time and speed -> accel)
speed and accel
This then passes on speed, accel and (if
supplied) slope to the method defined by
calc.method. (This means other VSP functions run
via calcVSP(..., calc.method = function)
share this option without needed dedicated code.)
calcVSP_JimenezPalacios calculates VSP according
to Jimenez Palacios methods. See References and Note below.
refVSPBin... functions generate a reference list of
VSP bins:
refVSPBin is a wrapper that generates VSP Mode bins
depending on method applied.
binVSP_NCSU.14 bins supplied vsp using the
14 bin method described in Frey et al 2002.
binVSP_MOVES.23 bins supplied vsp using that
and speed and the 23 bin MOVES method (See Note).
VSPPlot generates various plots of VSP (x-axis) and
emission (y-axis) data.
VSPBinPlot generates various plots of VSP binned data.
Value
calcVSP by default uses the Jimenez Palacios method
to calculate VSP in kW/metric ton.
refVSPBin generates a pems.element factor
vector of VSP Mode bin assignments.
VSPPlot and VSPBinPlot generate plots as
lattice objects.
Note
calcVSP... constants can be set/modified in the
calculation call, e.g.
calcVSP(..., vsp.a = [new.value]). If not supplied,
defaults are used. (See References.)
binVSP_MOVES.23 is in-development. Do not use without
independent confirmation of values.
Unit handling in pems.utils is via
checkUnits,
getUnits, setUnits and
convertUnits.
See common.calculations for details.
Author(s)
Karl Ropkins
References
calcVSP_JimenezPalacios uses methods described in:
Jimenez-Palacios, J.L. (1999) Understanding and Quantifying Motor Vehicle Emissions with Vehicle Specific Power and TILDAS Remote Sensing. PhD Thesis, Massachusetts Institute of Technology, Cambridge, MA.
vehicle.weight is the vehicle mass (in metric tons),
and vsp.a, vsp.b, vsp.c and vsp.g
are the calculations constants for:
vsp = speed * (a * accel + (g * slope) + b) + (c * speed^3)
By default: a = 1.1, b = 0.132, c = 0.000302 and g = 0.132 (as of Jimenez-Palacios, 1999).
Method ONLY INTENDED FOR vehicles < 3.855 metric tons.
refVSPBin_NCSU.14 VSP binning as described in:
Frey, H.C., Unal, A., Chen, J., Li, S. and Xuan, C., 2002. Methodology for developing modal emission rates for EPA's multi-scale motor vehicle & equipment emission system. Ann Arbor, Michigan: US Environmental Protection Agency. (EPA420-R-02-027)
See Also
See common.calculations (and
checkUnits and
convertUnits) for details of data management.
Examples
###########
##example 1
###########
#basic usage
vsp <- calcVSP(velocity, time = local.time, data = pems.1)
#where the returned object, vsp, is vsp values as pems.element
ncsu.14 <- refVSPBin(vsp)
#where the returned object, nscu.14, is the associated modal bin
# assignments based on the Frey et al (2002) 14 bin method.
Emission calculations
Description
Functions associated with emissions calculations.
Usage
calcEm(conc = NULL, calc.method = calcEm_HoribaPitot,
analyte = NULL, ..., data = NULL, fun.name = "calcEm",
force = FALSE, this.call = NULL)
calcEm_HoribaPitot(conc = NULL, time = local.time, exflow = exh.flow.rate,
extemp = exh.temp, express = exh.press, analyte = NULL,
delay = NULL, mm = NULL, ..., force = force, data = NULL,
fun.name = "calcEm_HoribaPitot", this.call = NULL)
Arguments
conc |
(Data series, typically pems.element vector) Analyte/species concentrations, the main input for
calculating emissions. If |
time, exflow, extemp, express |
(Data series, typically pems.element vectors) Other inputs used when calculating emissions. The
combination depending on the calcuation method used (and set by |
calc.method |
(Required function) The function to use to calculate emissions. (Default
|
analyte |
(Optional character vector) The analyte emissions are to be calculated for. If supplied,
this is used as a reference when assigning molecule weight and other analyte properties
if these are not provided as part of calculate call. If not supplied, |
... |
(Optional) Other arguments, currently passed on to function provided as
|
data |
(Optional |
fun.name, this.call, force |
(Various pems management functions) |
delay, mm |
(Optional numerics) Emissions calculation constants. |
Details
calcEm... functions calculate emissions.
calcEm is a wrapper function which is intended to provide a conventient front for
emissions calculation methods. It accepts an input conc which it checks and passes
on to calc.method, along with other supplied arguments.
calcEm_HoribaPitot calculates emissions using methods described in the Horiba OBS
Operators Manual. In addition to conc, the function requires the time, and exhaust
flow data series (measured by the OBS Pitot flow meter). By default, the function assumes
that these are default names that are generated for these when standard OBS files are
imported into R using the pems.utils import function importOBS2PEMS.
See References and Note below.
Value
calcEm_HoribaPitot (and calcEm by default) use Horiba Manual methods to
calculate emissions (in g/s).
Note
calcEm... constants can be set/modified in the calculation call, e.g.
calcEm(..., delay = [new.value]). If not supplied, these are first checked for
in the associated pems object (if supplied), or set to default values. See
References. If analyte-related constants are to be added to a pems object,
these should be named in the format '[type].[analyte]', e.g. delay.co for
the delay constant to be used for the analyte CO.
Unit handling in pems.utils is via checkUnits, getUnits,
setUnits and convertUnits. See common.calculations
for details.
Author(s)
Karl Ropkins
References
calcEm_HoribaPitot uses methods described in:
The Horiba Operators Manual.
See Also
See common.calculations.
Examples
###########
##example 1
###########
#basic usage
em.co <- calcEm(conc.co, data = pems.1)
#where the returned object, em.co, is a pems.element
Cold Start Emissions related code
Description
Functions associated with Cold Start Emissions calculations.
Usage
#calculations
fitColdStart(em, time, engine.on = NULL,
data = NULL, method = 2, ...,
fun.name="fitColdStart")
#Cold Start Plots
coldStartPlot(time, em = NULL,
..., data = NULL, engine.on = NULL,
plot.type = 1, method = 2,
fun.name="coldStartPlot")
panel.coldStartPlot1(..., loa.settings = FALSE)
panel.coldStartPlot2(..., loa.settings = FALSE)
Arguments
em, time |
(Typically pems.element vectors) |
engine.on |
(Optimal, single Numeric) The time the emission source, e.g.
monitored vehicle engine, was started. If not supplied, this
is assumed to be start of the supplied |
data |
(Optional, typically |
method |
(Optinal, Numeric) The method to use when fitting and
calculating the cold start contribution: method |
... |
(Optional) Other arguments, currently passed on as supplied to assoicated calculation or plotting function, or passed back to pemsPlot. |
fun.name |
(Optional character) The name of the parent function, to be used in error messaging. |
plot.type |
(Optional numeric) For |
loa.settings |
(Logical) For |
Details
fitColdStart fits a cold start model to the supplied
emissions and time-series data.
coldStartPlot generates a plot of the cold start model.
panel.coldStartPlot1 and panel.coldStartPlot1
are plot panels used by coldStartPlot when generating
plot.types 1 and 2, respectively.
Value
fitColdStart generates a cold start contribution
report as a pems dataset.
coldStartPlot generates a cold start contribution
report as a lattice plot.
Note
Regarding engine.on: This is specifically the time
the engine is turned on rather than the row of data set
where this happens. In some cases, they are same, e.g. when
the data is logged at a regular 1-Hz and data capture is
complete.
Regarding method: Method 1 (break-point) and method 2
(modified break-point) are based on the identification of a
change point in the accumulated emissions profile.
[Doc further]
(See References.)
Author(s)
Karl Ropkins
References
fitColdStart uses methods described in:
[Heeb]
[Ropkins cold start]
See Also
See common.calculations (and
checkUnits and
convertUnits) for details of data management.
Examples
###########
##example 1
###########
#basic usage
#to do/maybe not run... time to compile...
Speed Emissions related code
Description
Functions associated with Speed/Emissions terms.
Usage
#calculations
fitSpeedEm(em, time, speed, engine.on = NULL,
data = NULL, method = 1, min.speed = 5,
bin.size = NULL, ...,
fun.name="fitEmSpeed")
#speed/emissions Plots
speedEmPlot(speed, em = NULL, time = NULL,
..., data = NULL, engine.on = NULL,
min.speed = 5, bin.size = NULL,
plot.type = 1, method = 1,
fun.name="speedEmPlot")
Arguments
em, time, speed |
(Typically pems.element vectors) |
engine.on |
(Optimal, single Numeric) The time the emission source, e.g.
monitored vehicle engine, was started. If not supplied, this
is assumed to be start of the supplied |
data |
(Optional, typically |
method |
(Optinal, Numeric) The method to use when calculating
and binning data: method |
min.speed |
(Optinal, Numeric) measurements when speeds were less than
this value are exluded, default value |
bin.size |
(Optinal, Numeric) The data binning scale to use. For
|
... |
(Optional) Other arguments, currently passed on as supplied to associated calculation or plotting function, or back to pemsPlot. |
fun.name |
(Optional character) The name of the parent function, to be used in error messaging. |
plot.type |
(Optional numeric) For |
Details
fitSpeedEm builds a speed and g/km emissions
data sets for the supplied emissions, speed and
time-series data.
speedEmPlot generates a plot of one or more
data set generated by fitSpeedEm.
Value
fitSpeedEm generates a speed/emissions contribution
report as a pems dataset.
speedEmPlot generates a speed/emissions contribution
report as a lattice plot.
Note
Regarding engine.on: This is specifically the time
the engine is turned on rather than the row of data set
where this happens. In some cases, they are same, e.g. when
the data is logged at a regular 1-Hz and data capture is
complete.
Regarding method: Method 1 [Doc further].
[Doc further]
(See References.)
Author(s)
Karl Ropkins
References
fitColdStart uses methods described in:
[COPERT on speed/emission terms]
[Ropkins speed/emissions]
See Also
See common.calculations (and
checkUnits and
convertUnits) for details of data management.
Examples
###########
##example 1
###########
#basic usage
#to do/maybe not run... time to compile...
Functions to use tidyverse code with pems.utils outputs
Description
Various codes and methods.
Usage
#ggplot2
## S3 method for class 'pems'
fortify(model, data, ...)
#dplyr (1) standard methods
## S3 method for class 'pems'
select(.data, ...)
## S3 method for class 'pems'
rename(.data, ...)
## S3 method for class 'pems'
filter(.data, ...)
## S3 method for class 'pems'
arrange(.data, ...)
## S3 method for class 'pems'
slice(.data, ...)
## S3 method for class 'pems'
mutate(.data, ..., units=NULL, warn=TRUE)
## S3 method for class 'pems'
group_by(.data, ..., .add=FALSE)
## S3 method for class 'pems'
groups(x)
## S3 method for class 'pems'
ungroup(x, ...)
## S3 method for class 'pems'
group_size(x)
## S3 method for class 'pems'
n_groups(x)
## S3 method for class 'pems'
summarise(.data, ...)
## S3 method for class 'pems'
pull(.data, ...)
#dplyr (2) related underscore methods
## S3 method for class 'pems'
select_(.data, ..., warn=TRUE)
## S3 method for class 'pems'
rename_(.data, ..., warn=TRUE)
## S3 method for class 'pems'
filter_(.data, ..., warn=TRUE)
## S3 method for class 'pems'
arrange_(.data, ..., warn=TRUE)
## S3 method for class 'pems'
slice_(.data, ..., warn=TRUE)
## S3 method for class 'pems'
mutate_(.data, ..., units=NULL, warn=TRUE)
## S3 method for class 'pems'
group_by_(.data, ..., .add=FALSE, warn=TRUE)
## S3 method for class 'pems'
summarise_(.data, ..., warn=TRUE)
#dplyr (3) joining methods
## S3 method for class 'pems'
inner_join(x, y, by = NULL, copy = FALSE, ...)
## S3 method for class 'pems'
left_join(x, y, by = NULL, copy = FALSE, ...)
## S3 method for class 'pems'
right_join(x, y, by = NULL, copy = FALSE, ...)
## S3 method for class 'pems'
full_join(x, y, by = NULL, copy = FALSE, ...)
## S3 method for class 'pems'
semi_join(x, y, by = NULL, copy = FALSE, ...)
## S3 method for class 'pems'
anti_join(x, y, by = NULL, copy = FALSE, ...)
Arguments
model, data |
(pems.object) In |
... |
(Optional) Other arguments, typically passed on to equivalent tidyverse function or method. |
.data |
(pems.object) For |
warn |
(Optional) Give warnings? For an underscore methods: a warning that an underscore method was used (See Below). For mutate: if new elements are generated without unit assignments. |
units |
(Character) In mutate, the units to assign to new elements created by call. See Below. |
x, y |
(Various) For |
.add |
(Optional) Argument used by |
by, copy |
(Various) For |
Details
fortify is used by ggplot2 functions
when these are used to plot data in a pems
dataset. Most users will never have to use this
directly.
The pems object methods select,
rename, filter,
arrange, slice, mutate,
group_by and summarise are similar
to data.frame methods of the same
names in dplyr, but (hopefully) they
also track units, etc, like a pems object.
Work in progress. See below, especially Note.
Equivalent underscore methods (select_, etc)
are also provided, although it should be noted that
they are probably going when dplyr drops
these.
Data joining methods include inner_join,
left_join, right_join, full_join,
semi_join and anti_join. Like above
these are similar data.frame equivalents in
dplyr, but (hopefully) also track units, etc,
like a pems object. Same 'work in progress' caveat.
See Note.
Value
select returns the requested part of the
supplied pems object, e.g.:
select(pems.1, velocity) returns the velocity
element of pems.1 as a single column pems.object,
consistent with the data.frame handling of
select.data.frame.
rename returns the supplied pems object with
the requested name change, e.g.:
rename(pems.1, speed=velocity) returns pems.1
with the velocity column renamed speed.
filter returns the supplied pems object after
the requested filter operation has been applied,
e.g.: filter(pems.1, velocity>0.5) returns
pems.1 after excluding all rows where the velocity
value was less than or equal to 0.5.
arrange returns the supplied pems object
reordered based on order of values in an identified
element, e.g.: arrange(pems.1, velocity)
returns pems.1 with its row reordered lowest to
highest velocity entry.
slice returns requested rows of the supplied
pems object, e.g.: slice(pems.1, 1:10) returns
rows 1 to 10 of pems.1 as a new pems object.
mutate returns the supplied pems object with
extra elements calculated as requested, e.g.:
mutate(pems.1, new=velocity*2) returns the
pems object with additional column, called new, which
is twice the values in the velocity column. The units
of the new column can be set using the additional
argument units, e.g.
mutate(pems.1, new=velocity*2, units="ick").
group_by returns a grouped_df object,
which allowed by-group handling in subsequent
dplyr code.
summarise works like
summarise(data.frame, ...) and allows
dataset calculations, e.g.
summarise(pems, mean(velocity)) calculates
the mean of the velocity of a supplied
pems object. Units cannot be tracked
during such calls and outputs are returned as
a tibble as with summarise.data.frame.
The ..._join joining methods, join two
supplied datasets. The first, x,
must be a pems to employ ..._join.pems
but the second, y can be e.g. a
data.frame, etc.
Warning
This currently work in progress - handle with care.
Note
Currently not sure what I think about tidyverse, but
it is always interesting, and ideas like
fortify are nice.
The fortify method was developed by
Hadley Wickham to simplify the integration of
ggplot2 functions and special object classes.
It is a really nice idea for multiple reasons, the
main one being that package users will probably never
have to worry about it. However, packaging it means
you can use a pems object directly
as the data argument with ggplot2 code.
Author(s)
Karl Ropkins
References
Generics in general:
H. Wickham. Advanced R. CRC Press, 2014.
(Not yet fully implemented within this package.)
ggplot2:
H. Wickham. ggplot2: elegant graphics for data analysis. Springer New York, 2009.
(See Chapter 9, section 9.3, pages 169-175, for discussion of fortify)
dplyr:
Hadley Wickham, Romain Francois, Lionel Henry and Kirill Muller (2020). dplyr: A Grammar of Data Manipulation. R package version 1.0.2. https://CRAN.R-project.org/package=dplyr
example data for use with pems.utils
Description
Example data intended for use with functions in pems.utils.
Usage
pems.1
Format
pems.1 is a example pems object.
Details
pems.1 is supplied as part of the pems.utils package.
Note
None at present
Source
Reference in preparation
References
None at present
See Also
See examples in pems.structure.
reference data for use with pems.utils
Description
Various reference and example datasets intended for use with functions in
pems.utils.
Usage
ref.unit.conversions
ref.chem
ref.petrol
ref.diesel
pems.scheme
Format
ref.unit.conversions: Unit conversion methods stored as a list of lists. See Details.
ref.chem, ref.petrol, ref.diesel: Common chemical and fuel constants stored as lists.
pems.scheme: Default scheme for pems.utils plots.
Details
unit.conversions is basically a 'look-up' for unit conversion methods. Each element of
the list is another list. These lists are each individual conversion methods comprising four
elements: to and from, character vectors given the unit ids and alias of the unit
types that can be converted using the method; conversion, a function for the associated
conversion method; and (possibly) tag, a more detailed description of the conversion
intended for use in documentation.
Other ref... are sets of constants or reference information stored as lists. ref.chem
contains atomic weights of some elements and molecular weights of some species. ref.petrol and
ref.diesel contain default properties for typical fuels.
Note
ref.unit.conversions can be updated locally. See convertUnits,
addUnitConversion, etc.
Examples
#basic structure
ref.unit.conversions[[1]]