%% Common Ways to Access Data Using Categorical Arrays
% This example shows how to index and search using categorical arrays. You can access data using categorical arrays stored within a table in a similar manner.
%% Load Sample Data
% Load sample data gathered from 100 patients.

load patients
whos

%
%% Create Categorical Arrays from Cell Arrays of Character Vectors
% Gender and Location contain data that belong in categories. Each cell array contains character vectors taken from a small set of unique values (indicating two genders and three locations respectively). Convert Gender and Location to categorical arrays.

Gender = categorical(Gender);
Location = categorical(Location);

%
%% Search for Members of a Single Category
% For categorical arrays, you can use the logical operators == and ~= to find the data that is in, or not in, a particular category.
% Determine if there are any patients observed at the location, 'Rampart General Hospital'.

any(Location=='Rampart General Hospital')

% There are no patients observed at Rampart General Hospital.
%
%% Search for Members of a Group of Categories
% You can use ismember to find data in a particular group of categories. Create a logical vector for the patients observed at County General Hospital or VA Hospital.

VA_CountyGenIndex = ...
    ismember(Location,{'County General Hospital','VA Hospital'});

% VA_CountyGenIndex is a 100-by-1 logical array containing logical true (1) for each element in the categorical array Location that is a member of the category County General Hospital or VA Hospital. The output, VA_CountyGenIndex contains 76 nonzero elements.
%
% Use the logical vector, VA_CountyGenIndex to select the LastName of the patients observed at either County General Hospital or VA Hospital.

VA_CountyGenPatients = LastName(VA_CountyGenIndex);

% VA_CountyGenPatients is a 76-by-1 cell array of character vectors.
%
%% Select Elements in a Particular Category to Plot
% Use the summary function to print a summary containing the category names and the number of elements in each category.

summary(Location)

% Location is a 100-by-1 categorical array with three categories. County General Hospital occurs in 39 elements, St. Mary s Medical Center in 24 elements, and VA Hospital in 37 elements.
%
% Use the summary function to print a summary of Gender.

summary(Gender)

% Gender is a 100-by-1 categorical array with two categories. Female occurs in 53 elements and Male occurs in 47 elements.
%
% Use logical operator == to access the age of only the female patients. Then plot a histogram of this data.

figure()
histogram(Age(Gender=='Female'))
title('Age of Female Patients')

% histogram(Age(Gender=='Female')) plots the age data for the 53 female patients.
%
%% Delete Data from a Particular Category
% You can use logical operators to include or exclude data from particular categories. Delete all patients observed at VA Hospital from the workspace variables, Age and Location.

Age = Age(Location~='VA Hospital');
Location = Location(Location~='VA Hospital');

% Now, Age is a 63-by-1 numeric array, and Location is a 63-by-1 categorical array.
%
% List the categories of Location, as well as the number of elements in each category.

summary(Location)

% The patients observed at VA Hospital are deleted from Location, but VA Hospital is still a category.
%
% Use the removecats function to remove VA Hospital from the categories of Location.

Location = removecats(Location,'VA Hospital');

%
% Verify that the category, VA Hospital, was removed.

categories(Location)

% Location is a 63-by-1 categorical array that has two categories.
%
%% Delete Element
% You can delete elements by indexing. For example, you can remove the first element of Location by selecting the rest of the elements with  Location(2:end). However, an easier way to delete elements is to use [].

Location(1) = [];
summary(Location)

% Location is a 62-by-1 categorical array that has two categories. Deleting the first element has no effect on other elements from the same category and does not delete the category itself.
%
%% Check for Undefined Data
% Remove the category County General Hospital from Location.

Location = removecats(Location,'County General Hospital');

%
% Display the first eight elements of the categorical array, Location.

Location(1:8)

% After removing the category, County General Hospital, elements that previously belonged to that category no longer belong to any category defined for Location. Categorical arrays denote these elements as undefined.
%
% Use the function isundefined to find observations that do not belong to any category.

undefinedIndex = isundefined(Location);

% undefinedIndex is a 62-by-1 categorical array containing logical true (1) for all undefined elements in Location.
%
%% Set Undefined Elements
% Use the summary function to print the number of undefined elements in  Location.

summary(Location)

%
% The first element of Location belongs to the category, St. Mary's Medical Center. Set the first element to be undefined so that it no longer belongs to any category.

Location(1) = '<undefined>';
summary(Location)

% You can make selected elements undefined without removing a category or changing the categories of other elements. Set elements to be undefined to indicate elements with values that are unknown.
%
%% Preallocate Categorical Arrays with Undefined Elements
% You can use undefined elements to preallocate the size of a categorical array for better performance. Create a categorical array that has elements with known locations only.

definedIndex = ~isundefined(Location);
newLocation = Location(definedIndex);
summary(newLocation)

%
% Expand the size of newLocation so that it is a 200-by-1 categorical array. Set the last new element to be undefined. All of the other new elements also are set to be undefined. The 23 original elements keep the values they had.

newLocation(200) = '<undefined>';
summary(newLocation)

% newLocation has room for values you plan to store in the array later.
% Copyright 2012 The MathWorks, Inc.