Documentation

Ordinal Categorical Arrays

Order of Categories

categorical is a data type to store data with values from a finite set of discrete categories, which can have a natural order. You can specify and rearrange the order of categories in all categorical arrays. However, you only can treat ordinal categorical arrays as having a mathematical ordering to their categories. Use an ordinal categorical array if you want to use the functions min, max, or relational operations, such as greater than and less than.

The discrete set of pet categories {'dog' 'cat' 'bird'} has no meaningful mathematical ordering. You are free to use any category order and the meaning of the associated data does not change. For example, pets = categorical({'bird','cat','dog','dog','cat'}) creates a categorical array and the categories are listed in alphabetical order, {'bird' 'cat' 'dog'}. You can choose to specify or change the order of the categories to {'dog' 'cat' 'bird'} and the meaning of the data does not change.

ordinal categorical arrays contain categories that have a meaningful mathematical ordering. For example, the discrete set of size categories {'small', 'medium', 'large'} has the mathematical ordering small < medium < large. The first category listed is the smallest and the last category is the largest. The order of the categories in an ordinal categorical array affects the result from relational comparisons of ordinal categorical arrays.

How to Create Ordinal Categorical Arrays

This example shows how to create an ordinal categorical array using the categorical function with the 'Ordinal',true name-value pair argument.

Ordinal Categorical Array from a Cell Array of Character Vectors

Create an ordinal categorical array, sizes, from a cell array of character vectors, A. Use valueset, specified as a vector of unique values, to define the categories for sizes.

A = {'medium' 'large';'small' 'medium'; 'large' 'small'};
valueset = {'small', 'medium', 'large'};

sizes = categorical(A,valueset,'Ordinal',true)
sizes = 3x2 categorical array
medium      large
small       medium
large       small

sizes is 3-by-2 ordinal categorical array with three categories such that small < medium < large. The order of the values in valueset becomes the order of the categories of sizes.

Ordinal Categorical Array from Integers

Create an equivalent categorical array from an array of integers. Use the values 1, 2, and 3 to define the categories small, medium, and large, respectively.

A2 = [2 3; 1 2; 3 1];
valueset = 1:3;
catnames = {'small','medium','large'};

sizes2 = categorical(A2,valueset,catnames,'Ordinal',true)
sizes2 = 3x2 categorical array
medium      large
small       medium
large       small

Compare sizes and sizes2

isequal(sizes,sizes2)
ans = logical
1

sizes and sizes2 are equivalent categorical arrays with the same ordering of categories.

Convert a Categorical Array from Nonordinal to Ordinal

Create a nonordinal categorical array from the cell array of character vectors, A.

sizes3 = categorical(A)
sizes3 = 3x2 categorical array
medium      large
small       medium
large       small

Determine if the categorical array is ordinal.

isordinal(sizes3)
ans = logical
0

sizes3 is a nonordinal categorical array with three categories, {'large','medium','small'}. The categories of sizes3 are the sorted unique values from A. You must use the input argument, valueset, to specify a different category order.

Convert sizes3 to an ordinal categorical array, such that small < medium < large.

sizes3 = categorical(sizes3,{'small','medium','large'},'Ordinal',true);

sizes3 is now a 3-by-2 ordinal categorical array equivalent to sizes and sizes2.

Working with Ordinal Categorical Arrays

In order to combine or compare two categorical arrays, the sets of categories for both input arrays must be identical, including their order. Furthermore, ordinal categorical arrays are always protected. Therefore, when you assign values to an ordinal categorical array, the values must belong to one of the existing categories. For more information see Work with Protected Categorical Arrays.