Soil morphology, observed properties, and geomorphic context represent a complex package of interrelated information that can be difficult to analyze and communicate as a whole. Graphical methods such as soil profile sketches and cross-sections represent a few of the possible methods commonly used to report on these kind of data. The Algorithms for Quantitative Pedology (AQP) project encompasses several related R packages tailored to this style of work. A specialized data structure (SoilProfileCollection) maintains linkages between soil horizons, diagnostic features, above-ground data, and geomorphic context. SoilProfileCollection objects can be filtered, subset, resampled (over new depth intervals), and re-ordered; all while preserving links to above and below-ground, linked data. Functions are provided for the conversion of soil colors to and from Munsell notation and several other color space coordinates. Graphical methods for the SoilProfileCollection provide a simple but flexible framework for the design and layout of soil profile sketches, aligned to x and or y axes defined by linked data.

`depths()`

: init an SPC from`data.frame`

`site()`

: set or add site-level attributes of an SPC

`quickSPC()`

: quickly build an SPC from simple text templates`random_profile()`

: generate random SPC from suite of depth functions

`hzdesgnname()`

: get/set column containing horizon designations`hzDesgn()`

: get vector of horizon designations`hztexclname()`

: get/set column containing horizon texture class`metadata()`

: get/set SPC metadata (list)`hzID()`

: get vector of horizon IDs`hzidname()`

: get/set column containing horizon IDs`horizonDepths()`

get/set columns containing horizon top and bottom depths

`length()`

: number of profiles in a SPC`nrow()`

: number of horizons in a SPC`names()`

: list of horizon and site names`siteNames()`

: site-level column names`horizonNames()`

: horizon-level column names

`glom()`

: extract horizons based on overlap criteria defined by point or interval`trunc()`

: truncate SPC to given depth interval`subset()`

: subset profiles based on logical expressions`subsetHz()`

: subset horizons based on logical expressions`[`

:`data.frame`

-like subsetting of profiles (i-index) and/or horizons (j-index)`[[`

: access site or horizon-level columns by name`k-index expressions`

:`.FIRST`

,`.LAST`

,`.HZID`

,`.NHZ`

`min()`

: minimum bottom depth within a SPC`max()`

: maximum bottom depth within a SPC`depthOf()`

: generalized “depth to” based on REGEX matching`minDepthOf()`

: special case of`depthOf()`

`maxDepthOf()`

: special case of`depthOf()`

`getSoilDepthClass()`

: estimate soil depth based on REGEX matching applied to horizon designation and associated depth class`aggregateSoilDepth()`

: statistical estimation of soil depth (REGEX matching of horizon designation) within groups of profiles

`combine()`

,`c()`

: combine multiple SPCs into a single SPC`duplicate()`

: duplicate profiles within a SPC`perturb()`

: randomly adjust horizon thickness or depths to simulate from a template SPC`warpHorizons()`

: expand / contract horizon thickness`harmonize()`

: create new profiles within a SPC based sets of related horizon-level data`hzAbove()`

,`hzBelow()`

: locate horizons above or below some criteria`unique()`

: determine uniqueness among profiles of an SPC via MD5 hash`split()`

: split SPC into list of SPCs based on grouping factor`site()`

: get site data as`data.frame`

`horizons()`

: get horizon data as`data.frame`

`replaceHorizons()`

: replace horizon data`diagnostic_hz()`

: get/set diagnostic features`restrictions()`

: get/set restrictions`denormalize()`

: convert site-level data into horizon-level data via replication`compositeSPC()`

: downgrade an SPC to list of site and horizon-level data

`profileApply()`

: apply a function to each profile within an SPC (slow but simple interface)`summarizeSPC()`

: perform group-wise summaries over profiles within an SPC`transform()`

: modify a SPC using expressions that operation on site or horizon-level data

`dice()`

: convert SPC to 1 depth-unit intervals by replication`slab()`

: apply an aggregate function over groups within a “dice()-ed” SPC`spc2mpspline()`

: interface to equal-area spline fitting from mpspline2 package`segment()`

: generate segment labels for depth-weighted aggregation`L1_profiles()`

: create representative profiles via multivariate median (L1 estimator)`slicedHSD()`

: apply Tukey’s HSD over groups within a “dice()-ed” SPC

`accumulateDepths()`

: fix horizon depths when old-style O horizon notation has been used`fillHzGaps()`

: fill topological gaps in horizon depth`repairMissingHzDepths()`

: attempt fixing missing or duplicated horizon bottom depths`flagOverlappingHz()`

: flag horizons with perfect overlap`checkHzDepthLogic()`

: apply battery of horizon depth topological tests`splitLogicErrors()`

: split an SPC according to variety of possibly horizon depth errors`HzDepthLogicSubset()`

: remove profiles from an SPC if any depth logic errors are present

`evalMissingData()`

: report metrics of missing data by profile within SPC`missingDataGrid()`

: visual indication of missing data`profileInformationIndex()`

: experimental indices of “information content” by profile

`as(SPC, 'list')`

: convert SPC to`list`

`as(SPC, 'data.frame')`

: convert site and horizon data to`data.frame`

`as(SPC, 'sf')`

: convert site and spatial data to sf object

`prj()`

: get/set coordinate reference system (CRS) metadata`initSpatial()`

: set (site-level) column names containing coordinates`getSpatial()`

: get spatial data (site + coordinates) from an SPC

`checkSPC()`

: check SPC for internal consistency`rebuildSPC()`

: re-make an SPC from a previous version of aqp (rarely required)

`plotSPC()`

: create sketches of soil profiles from an SPC`explainPlotSPC()`

: explain various elements of a soil profile sketch`groupedProfilePlot()`

: create grouped sketches of soil profiles`plotMultipleSPC()`

: create sketches from multiple, possibly non-conformal SPCs`addBracket()`

: add vertical brackets beside soil profile sketches`addDiagnosticBracket()`

: add vertical brackets beside soil profile sketches based on diagnostic features`addVolumeFraction()`

: add visual explanation of coarse fragment volume to soil profile sketches`alignTransect()`

: align soil profiles to an external gradient such as topographic sequence

`col2Munsell()`

: convert various color notations to Munsell notation`munsell2rgb()`

: convert Munsell notation to sRGB or CIELAB color coordinates`parseMunsell()`

: parse and optionally convert a munsell color`spec2Munsell()`

: estimate the closest Munsell color given reflectance spectra in the visible range`getClosestMunsellChip()`

: estimate a reasonably close Munsell color given non-standard notation`estimateSoilColor()`

: estimate moist soil color from dry soil color (and vice versa)

`colorContrast()`

: pair-wise color contrast and CIE2000 (dE00) based on colors in Munsell notation`colorContrastPlot()`

: visual explanation of soil color contrast and dE00`contrastChart()`

: Munsell color book style explanation of soil color contrast and dE00`soilColorSignature()`

: derive soil color signatures for profiles within an SPC

`colorChart()`

: Munsell color book representation of color frequency`aggregateColor()`

: estimate color proportions within an SPC according within groups of horizons`colorQuantiles()`

: marginal and L1 quantiles of color in CIELAB coordinates

`huePosition()`

: generate an ordered factor of the standard Munsell hues`huePositionCircle()`

: graphical representation of the standard Munsell hues, with optional simulation of common color vision deficiency`simulateColor()`

: simulate a range of Munsell colors given measures of central tendency and spread`previewColors()`

: graphical preview of colors as a grid or via nMDS`soilPalette()`

: generate swatch-like arrangements of colors and labels`equivalentMunsellChips()`

: for a specified Munsell color, identify other Munsell colors with a very lower CIE2000 color contrast difference

`mixMunsell()`

: simulate an subtractive mixture of pigments specified in Munsell notation`plotColorMixture()`

: simulate a subtractive mixture of pigments, display reflectance spectra

`NCSP()`

: numerical classification of soil profiles, within a`SoilProfileCollection`

`compareSites()`

: pair-wise comparison of site-level data from a`SoilProfileCollection`

`allocate()`

: perform one of several classification systems to soil property data`estimateAWC()`

: estimate plant-available water holding capacity`correctAWC()`

: apply rock fragment or soluble salt corrections to AWC estimates`hzDistinctnessCodeToOffset()`

: convert horizon boundary distinctness codes to vertical offset`hzTopographyCodeToLineType()`

: convert horizon boundary topography codes to line types`hzTopographyCodeToOffset()`

: convert horizon boundary topography codes to offset`ph_to_rxnclass()`

: convert pH to reaction class`rxnclass_to_ph()`

: convert reaction class to pH range`ReactionClassLevels()`

: ordered factor of reaction classes`horizonColorIndices()`

: compute various soil color-based indices to horizons within an SPC

`textureTriangleSummary()`

: graphical summary of sand, silt, clay fractions on a soil texture triangle

`bootstrapSoilTexture()`

: simulation of realistic compositions (sand, silt, clay) from a small set of example data`SoilTextureLevels()`

: ordered factor of soil texture classes`texcl_to_ssc()`

: convert soil texture classes to sand, silt, clay centroids`ssc_to_texcl()`

: convert sand, silt, clay values to soil texture class`texture_to_taxpartsize()`

: convert soil texture to Soil Taxonomy particle size class

`fragmentSieve()`

: classify coarse fragments by fragment diameter`texmod_to_fragvoltot()`

: estimate ranges in coarse fragment volume based on a soil texture modifier`texture_to_texmod()`

`fragvol_to_texmod()`

`fragmentClasses()`

: coarse fragment diameter thresholds used by USDA-NRCS

`getArgillicBounds()`

: estimate the upper and lower boundaries of an argillic horizon`getCambicBounds()`

: estimate the upper and lower boundaries of a cambic horizon`getSurfaceHorizonDepth()`

`getMineralSoilSurfaceDepth()`

`getPlowLayerDepth()`

`hasDarkColors()`

`estimatePSCS()`

`generalize.hz()`

: apply REGEX rules to group horizon designations into a reduced set of “generalized horizon labels”`evalGenHZ()`

: evaluate internal consistency of assigned GHL`genhzTableToAdjMat()`

: convert a cross-tabulation of GHL vs. original horizon designations to adjacency matrix`get.ml.hz()`

: extract most likely horizon boundary depths from probability depth functions`guessGenHzLevels()`

: estimate the correct ordering of GHL given horizon depths`GHL()`

: get/set GHL metadata for a`SoilProfileCollection`

`invertLabelColor()`

: automatic adjustment of label color for maximum contrast, based on specified background color`hzTransitionProbabilities()`

: derive transition probability matrix from horizon level data`mostLikelyHzSequence()`

: use Markov Chains to predict the most likely sequence of horizons

`shannonEntropy()`

: Shannon entropy`brierScore()`

: Brier’s score`tauW()`

: weighted tau statistic

`findOverlap()`

: identify overlap within a vector of positions based on a given threshold`overlapMetrics()`

: metrics of overlap within a vector or positions based on a given threshold`fixOverlap()`

: attempt the minimum of adjustments to vector of positions such that a given distance threshold is enforced

`sp1`

`sp2`

`sp3`

`sp4`

`sp5`

`sp6`

`sierraTransect`

`wilson2022`

`rowley2019`

`jacobs2000`

`osd`

`SPC.with.overlap`

`us.state.soils`

`soil_minerals`

`munsell`

`equivalent_munsell`

`munsellHuePosition`

`munsell.spectra`

`spectral.reference`

`ROSETTA.centroids`

`reactionclass`

`soiltexture`