Cross-Tab Statistics

Corridor Designer Tools · Ancillary Corridor Tools · interactive window
Works at every ArcGIS Pro license level

Summary

Builds a cross-tabulation (contingency) table — a two-dimensional histogram showing how much of the landscape falls in each joint range of two variables. Sources: two fields of one table or feature class (weighted equally, by an attribute, or by geodesic feature size); two polygon layers (intersection regions, area-weighted); two rasters (paired cell values); or a polygon layer against a raster, sampled per cell or per polygon with a zonal statistic. The variables can be numeric or categorical: a text field such as an ownership type or a land-cover name becomes one class per distinct value, already labeled, and a raster takes its class names from its layer's unique-value symbology or from a name column in its attribute table — or is regrouped outright by any text column of that table, so a table with a Land Cover attribute field with 26 different land cover classes and an NLCD attribute field with 10 NLCD classes can be grouped and tabulated by either Land Cover or NLCD. Landfire EVT (Existing Vegetation Type) rasters are a good example of this: they often have many different classification systems available in the attribute table. Land cover by ownership comes out with every row and column named, nothing to type, and a per-polygon majority statistic gives the dominant class of each polygon when one observation per polygon is the right unit. (Names joined to a raster with a map-level Add Join live only in the layer and are not visible to the tool; use Join Field to write them into the attribute table.) Optionally restricts everything to an analysis polygon. Class names and ranges can be edited live; the table shows counts, sizes (hectares, acres, …) or percentages, and can be copied, exported to a geodatabase / dBASE / CSV table, or placed on a layout as editable graphics. A modernized port of the CorridorDesigner Evaluation Tools' Cross-Tab Statistics; no Spatial Analyst needed.

Learn more About Corridor Design covers the descriptors used to evaluate and compare corridors. Metric 3 of the Corridor Evaluation Tutorial cross-tabulates land cover by owner type inside the corridor with this window, with the tutorial data (41 MB) available to download so you can follow along.

In corridor evaluation

The two-variable cousin of Weighted Summary Statistics: where that tool summarizes one variable at a time, this window crosses two — land cover by ownership inside a linkage polygon, habitat suitability class by slope class, corridor coverage by parcel. Restricting everything to an analysis polygon makes it a natural evaluation instrument: the classic workshop example crossed a proposed linkage against a parcel map to show exactly who owns how many acres of it.

A tour of the window

The example is the land-cover-by-ownership table from the Corridor Evaluation Tutorial: a parcel layer classed by owner type against a land-cover raster, inside a corridor polygon. The input dialog opens with the window; New Analysis... brings it back.

The Corridor Designer Tools gallery open on the ribbon, with the Cross-Tab Statistics button, in the Ancillary Corridor Tools row, outlined in blue
Where to find it: Cross-Tab Statistics is in the Ancillary Corridor Tools row of the Corridor Designer Tools gallery, in the Corridor Designer Tools group of the Wildlife and Forestry tab.
The Cross-Tab Statistics input dialog: Two data sources; Variable 1 layer Black_Bear_Parcels with field Owner_Type; Variable 2 layer aml_landcover_clip with its Nlcd attribute column; raster variable statistic Cell Values; restrict analysis to Black Bear 2% Corridor
Two data sources: a polygon layer and a field for the columns, a raster for the rows. A raster with named classes in its attribute table offers those name columns in the second box; picking one (Nlcd here) regroups the cells by it. Every control has hover help.

A definition query is always honored, on a layer or table that supplies a variable and on the analysis polygon layer alike: the window works with the records each layer shows. When both variables come from one table or feature class, Selected records only narrows those records to the current selection.

The Cross-Tabulation Table window: the table on the left with a horizontal scroll bar, and a side panel with the two variable names, a Flip rows and columns checkbox, Edit Column Classes and Edit Row Classes buttons, Counts/sizes versus Percent, a Units drop-down set to Hectares, decimal places and Fonts
The window: a table that scrolls when it is larger than the panel, and the side panel that names the variables, edits the classes, and chooses sizes or percentages and the unit.
The exported table: rows are NLCD land-cover groups, columns are owner types, cells are hectares, with Other and Sum rows and columns
Save Image gives the whole table at once (PNG or SVG); Copy Table puts it on the clipboard as tab-separated text, Export Table writes it to a geodatabase, dBASE or CSV table, and Add to Layout places it as editable graphics.

What the table shows, in this case, is where the corridor's 9,015 hectares sit. Three land-cover groups account for almost all of it: scrub-shrub, evergreen forest and grassland, in that order. Developed and agricultural land comes to 26 hectares, under a third of one percent, which is the most reassuring number in the table and one that the parcel layer alone could not have given. Down the columns, the owner types differ in kind rather than in amount: individually owned ground is mostly scrub, the small lots at the low western end; government ground splits evenly between forest and scrub; and the family trusts hold the scrubbiest ground of all. The two Other lines the tool always includes are worth a look too. The Other row is zero, because every raster cell belongs to a land-cover group. The Other column is not: 2,490 hectares, 28% of the corridor, which is corridor ground inside no parcel at all, public land outside the county's parcel fabric and road rights-of-way, and it is the most heavily forested column in the table. Anyone planning a linkage here would want to know that the best forest in the corridor is not on anybody's tax roll. The tutorial reads the table line by line.

Flipping rows and columns

Which variable runs across and which runs down is a presentation choice, not an analysis choice, so the window lets you change it after the fact: the Flip rows and columns checkbox transposes the table without re-reading anything. A table with few columns and many rows reads well on a portrait page; flipped, the same numbers fit a wide layout. Every export — image, text, table, layout graphics — follows the current orientation.

The same window with Flip rows and columns checked: owner types now run down the rows and the land-cover groups across the columns
Flipped: owner types down, land cover across. The numbers are unchanged; only their arrangement is.
The exported flipped table: rows Corporate through Unknown plus Other and Sum, columns Barren Lands through Woody Wetland plus Other and Sum, the same hectare values transposed
The flipped table, saved as an image.

Cells or polygons: the raster variable statistic

With a polygon layer against a raster, the Raster variable statistic decides what one observation is. It changes the numbers, not just their precision, so it is worth seeing the same data both ways.

Cell Values takes one observation per raster cell, each cell paired with whatever polygon it falls in and weighted by its own area. That is the table shown above: 9,015 hectares of corridor, every cell counted, including the 2,490 hectares in the Other column that fall inside no parcel at all.

Polygon Majority takes one observation per polygon: the class covering the most of that polygon's cells, weighted by the polygon's own area. Run the same inputs that way and the table changes character.

The input dialog with the same inputs as before but Raster variable statistic set to Polygon Majority
The same inputs, statistic set to Polygon Majority. Because the raster is grouped by an attribute column, only Cell Values and Polygon Majority are offered.
The majority table: five land-cover rows only, Barren Lands 8 ha, Evergreen Forest 1,572, Grasslands-Herbaceous 995, Scrub-Shrub 3,917, Woody Wetland 47; no Other column; total 6,538 hectares
Each parcel now counts once, wholly, under its dominant land cover.

Three things differ, and each is a consequence of the unit of observation. First, there is no Other column and the total is 6,538 hectares, not 9,015: the observations are parcels, so ground in no parcel is simply not observed. Second, minority classes vanish into their neighbors — the developed and emergent-wetland rows are gone and barren lands drop from 146 hectares to 8, because a parcel that is mostly scrub with a strip of wash counts entirely as scrub. That is the point of the majority: it answers “what kind of parcel is this?”, not “what is on each acre?”. Third, even the column totals differ slightly — corporate ground is 2,356 hectares by cells and 2,361 by parcels — and that is a matter of measurement. Cell Values measures a parcel as the number of 30-meter cells whose centers fall inside it, times a cell's area; Polygon Majority measures it as its exact geodesic area. Over 1,564 parcels, some smaller than a single cell, the two disagree by about two tenths of one percent. When the totals must reconcile with a parcel table, use the polygon statistics; when the question is about the ground itself, use the cells.

The remaining polygon statistics — mean, minimum, maximum, range, standard deviation, sum — also take one observation per polygon, but summarize its cells as a number, which only makes sense for a continuous raster: elevation, suitability, distance. A mean of land-cover codes means nothing, which is why they are withheld whenever a raster is grouped by an attribute column. Against a continuous raster they come into their own:

The input dialog with Variable 2 set to the dem_m_clip raster, raster cell values, and Raster variable statistic set to Polygon Mean
Owner type against the elevation raster, one mean elevation per parcel. A continuous raster has no name column, so the second box stays at cell values.
The elevation table: four rows of equal-interval elevation classes, 1,005 to 1,206, 1,206 to 1,407, 1,407 to 1,608 and 1,608 to 1,809 meters, by owner type, in hectares; total 6,538 hectares
Each parcel placed in the elevation class of its mean elevation. The four classes are the window's default: equal intervals over the range actually observed, 1,005 to 1,809 meters.

For a continuous variable the classes are yours to define. Edit Row Classes... (or Column Classes) opens the class editor: set the number of classes and Autofill for equal intervals over the observed range, or type any minimum, maximum and name per class — 1,000 to 1,500 meters and 1,500 to 2,000, say, or classes that match a published elevation zonation. Classes are half-open (minimum ≤ value < maximum), the last class includes its maximum, equal minimum and maximum make a single-value class, and anything outside every class lands in Other. The table rebuilds as soon as you click OK; nothing is re-read.

The Edit Row Classes dialog for dem_m_clip: observed data range 1005.351 to 1808.875, Number of classes 4, an Autofill Class Definitions button, and four rows of class name, minimum and maximum
The class editor, showing the autofilled equal-interval classes. Any of the names or breaks can be edited before clicking OK.

Sizes or percentages

The Cell values group in the side panel switches the whole table between sizes and proportions. Counts / sizes shows each cell in the chosen unit — hectares, acres, square kilometers, square miles, or the native cells or record count. Percent shows each cell as its percentage of the grand total, so the table sums to 100; the row and column sums then read directly as each class's share of the whole. The Decimal places box applies to either view, and matters more for percentages, where a small class can disappear into 0.0 at one place and reappear at three.

The cell-values table shown as percentages of the total to two decimal places: Scrub-Shrub 40.83 percent, Evergreen Forest 31.49, Grasslands-Herbaceous 24.59, Barren Lands 1.62, Woody Wetland 1.15; column sums Corporate 26.14, Government 12.58, Individual 13.77, Nonprofit 0.02, Title Trust 10.23, Trust 7.87, Unknown 1.77, Other 27.62; total 100.00
The cell-values table as percentages of the whole corridor, two decimal places. The same numbers as the hectare table above, now read directly as shares: scrub is 41% of the corridor, corporate ground 26%, and the unparceled Other column 28%.

Recommended citation

Jenness, J., D. Majka and P. Beier. 2026. Cross-Tab Statistics. Wildlife and Forestry Tools add-in for ArcGIS Pro, v. 1.99 (September 2026). Jenness Enterprises. Available at: https://github.com/JeffJenness/Wildlife_Tools.

Credits and references

By Jeff Jenness, Jenness Enterprises (www.jennessent.com), modernizing the CorridorDesigner Evaluation Tools' Cross-Tab Statistics (Jenness, Majka and Beier).

Licensing information

Works at every ArcGIS Pro license level (Basic, Standard, Advanced). No extension licenses are required.