Segmenting of Soil Horizon Data by Depth Interval
This function adds depth interval ("segment") labels to soil horizon data associated with SoilProfileCollection
and data.frame
objects. Additional horizon records are inserted when a segment label does not overlap with a horizon boundary. See examples.
segment(object, intervals, trim = TRUE, hzdepcols = NULL)
object |
either a |
intervals |
a vector of integers over which to slice the horizon data (e.g. |
trim |
logical, when |
hzdepcols |
a character vector of length 2 specifying the names of the horizon depths (e.g. |
This function adds segment labels to soil horizon data according to intgervals
(e.g. c(25, 100) or 25:100). Compared to slice
, slab
, and glom
, segment
performs no aggregation or resampling of the source data, rather, labels are added to horizon records for subsequent aggregation. This makes it possible to process a very large number of records outside of the constraints associated with e.g. slice
or slab
.
Either a SoilProfileCollection
or data.frame
with the original horizon data segmented by depth intervals. There are usually more records in the resulting object, one for each time a segment interval partially overlaps with a horizon. A new column called segment_id
identifying the depth interval is added.
Stephen Roecker
# example data data(sp1) # upgrade to SPC depths(sp1) <- id ~ top + bottom # segment and trim z <- segment(sp1, intervals = c(0, 10, 20, 30), trim = TRUE) # display segment labels # note that there are new horizon boundaries at segments par(mar = c(0, 0, 3, 1)) plotSPC(z, color = 'segment_id', width = 0.3) # highlight new horizon records par(mar = c(0, 0, 2, 1)) plotSPC(z, color = NA, default.color = NA, width = 0.3, lwd = 1) plotSPC(sp1, color = NA, default.color = NA, width = 0.3, lwd = 3, add = TRUE, name = NA, print.id = FALSE) legend('top', horiz = TRUE, legend = c('original', 'segmented'), lwd = c(1, 3), cex = 0.85, bty = 'n') # same results as slab() # 10 random profiles s <- lapply(1:10, random_profile, n_prop = 1, SPC = TRUE, method = 'random_walk') s <- combine(s) a.slab <- slab(s, fm = ~ p1, slab.structure = c(0, 10, 20, 30), slab.fun = mean, na.rm = TRUE) z <- segment(s, intervals = c(0, 10, 20, 30), trim = TRUE) z <- horizons(z) z$thick <- z$bottom - z$top a.segment <- sapply(split(z, z$segment_id), function(i) { weighted.mean(i$p1, i$thick) }) res <- data.frame( slab = a.slab$value, segment = a.segment, diff = a.slab$value - a.segment ) print(res) res$diff < 0.001 data(sp5) # segment by upper 25-cm test1 <- segment(sp5, intervals = c(0, 100)) print(test1) nrow(test1) print(object.size(test1), units = "Mb") # segment by 1-cm increments test2 <- segment(sp5, intervals = 0:100) print(test2) nrow(test2) print(object.size(test2), units = "Mb") # segment and aggregate test3 <- segment(horizons(sp5), intervals = c(0, 5, 15, 30, 60, 100, 200), hzdepcols = c("top", "bottom") ) test3$hzthk <- test3$bottom - test3$top test3_agg <- by(test3, test3$segment_id, function(x) { data.frame( hzID = x$hzID[1], segment_id = x$segment_id[1], average = weighted.mean(x$clay, w = x$hzthk) ) }) test3_agg <- do.call("rbind", test3_agg) head(test3_agg)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.