This package provides functions to calculate PHAB metrics using field data.
The development version of this package can be installed from Github:
install.packages('devtools') library(devtools) install_github('SCCWRP/PHABMetrics') library(PHABMetrics)
devtools::load_all()
Input data format:
head(sampdat)
The core function is phabmetrics()
. Calulcate PHAB metrics with sample data:
alldat <- phabmetrics(sampdat)
mets <- names(alldat) mets <- gsub('\\..*$', '', mets) mets <- unique(mets)[!unique(mets) %in% 'StationCode']
The following r length(mets)
metrics are calculated:
mets
alldat
For every function, make sure there are no duplicate or conflicting values for every unique combination of id
, LocationCode
, AnalyteName
, and VariableResult
(or Result
). This should be specific to the metric classes just to be safe. For example, every combination should have only one entry in VariableResult
for AnalyteName %in% c('Microalgae Thickness', 'Macrophyte Cover', 'Macroalgae Cover, Attached', 'Macroalgae Cover, Unattached')
for the algae metrics. The algae.R
function will remove duplicate entries but a checker should be built that verifies a unique value can be determined.
Required column names, see those in sampdat
.
Check for required values in AnalyteName
(note that chkinp()
can check of the columns exist but we'll need a checker on data input to check for these and only these):
c('Microalgae Thickness', 'Macrophyte Cover', 'Macroalgae Cover, Attached', 'Macroalgae Cover, Unattached')
for algae()
c('Bankfull Height', 'Bankfull Width', 'StationWaterDepth', 'Wetted Width')
for bankmorph()
c('Cascade/Falls', 'Dry', 'Glide', 'Pool', 'Rapid', 'Riffle', 'Run'))
for channelmorph()
c(Slope', 'Length, Segment', 'Elevation Difference', 'Bearing', 'Proportion', 'Length, Reach')
for channelsinuosity()
c('Canopy Cover')
for densiometer()
c('Distance from Bank', 'StationWaterDepth', 'Velocity', 'Distance, Float', 'Float Time', 'Wetted Width')
for flow()
c('Fish Cover Macrophytes', 'Fish Cover Artificial Structures', 'Fish Cover Boulders', 'Fish Cover Filamentous Algae', 'Fish Cover Woody Debris >0.3 m', 'Fish Cover Live Trees/Roots', 'Fish Cover Overhang.Veg', 'Fish Cover Woody Debris <0.3 m', 'Fish Cover Undercut Banks')
for habitat()
c('Riparian Bridges/Abutments', 'Riparian Buildings', 'Riparian Landfill/Trash', 'Riparian Logging', 'Riparian Mining', 'Riparian Orchards/Vineyards', 'Riparian Park/Lawn', 'Riparian Pasture/Range', 'Riparian Pavement', 'Riparian Pipes', 'Riparian Road', 'Riparian Row Crops', 'Riparian Vegetation Management', 'Riparian Wall/Dike')
for disturbance()
c('Riffle/Run Channel Alteration', 'Riffle/Run Epifaunal Substrate', 'Riffle/Run Sediment Deposition', 'Dominant Land Use', 'Evidence of Fire', 'Evidence of Recent Rainfall')
for misc()
c('Bank Stability')
for bankstability()
c("Alkalinity as CaCO3", "Oxygen, Dissolved", "pH", "Salinity", "SpecificConductivity", "Temperature", "Turbidity")
for quality()
c('Riparian GroundCover Barren', 'Riparian GroundCover NonWoody Plants', 'Riparian GroundCover Woody Shrubs', 'Riparian Lower Canopy All Vegetation', 'Riparian Upper Canopy All Trees', 'Riparian Lower Canopy All Vegetation', 'Riparian Upper Canopy All Trees', 'Riparian GroundCover Woody Shrubs', 'Riparian GroundCover NonWoody Plants')
for ripveg()
c('Substrate Size Class', 'Embeddedness', 'CPOM')
for substrate()
Check for required values in LocationCode
(note that chkinp()
can check if the columns exist but we'll need a checker on data input to check for these and only these)
Maybe we need to add a checker to make sure all values in each field are present but with appropriate NA values for Result
, VariableResult
, this can be done with tidyr::complete()
but may be unnecessary since this will increase data volume
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.