Main Content

categorical

数组,包含分配给类别的值

说明

categorical 是为一组有限的离散类别(例如 HighMedLow)赋值的数据类型。这些类别可以采用您指定的数学排序,例如 High > Med > Low,但这并非必须。分类数组可用来有效地存储并方便地处理非数值数据,同时还为数值赋予有意义的名称。分类数组的常见用法是用来指定构成表的各组行。

创建对象

描述

示例

B = categorical(A) 根据数组 A 创建分类数组。B 的类别是 A 的唯一值且经过排序。

示例

B = categorical(A,valueset)valueset 中的每个值创建一个类别。B 的类别与 valueset 的值具有相同的顺序。

您可以使用 valueset 来包含 A 中不存在的值的类别。反之,如果 A 包含 valueset 中不存在的任何值,则 B 的对应元素为未定义。

示例

B = categorical(A,valueset,catnames) 通过将 valueset 中的类别值与 catnames 中的名称匹配来命名 B 中的类别。

示例

B = categorical(A,___,Name,Value) 创建分类数组,其中通过一个或多个 Name,Value 对组参数指定其他选项。您可以包括上述语法中的任何输入参数。

例如,要指示类别采用数学排序,请指定 'Ordinal',true

输入参数

全部展开

输入数组,指定为数值数组、逻辑数组、分类数组、日期时间数组、持续时间数组、字符串数组或字符向量元胞数组。

categorical 会删除作为字符串或字符向量的输入值中的前导和尾部空格。

如果 A 包含缺失值,则 B 的相应元素未定义,并显示为 <undefined>categorical 函数可将下列值转换为未定义的类别值:

  • 数值数组和持续时间数组中的 NaN

  • 字符串数组中的缺失字符串 (<missing>) 或空字符串 ("")

  • 字符向量元胞数组中的空字符向量 ('')

  • 日期时间数组中的 NaT

  • 分类数组中未定义的值 (<undefined>)

对于未定义的值,B 没有对应的类别。要为缺失值或未定义的值创建显式类别,必须在 catnames 中给出所需的类别名称,并在 valueset 中给出缺失值作为对应的值。

A 还可以是具有以下类方法的对象数组:

  • unique

  • eq

类别,指定为由唯一值组成的向量。valueset 的数据类型和 A 的数据类型必须相同,A 为字符串数组时除外。在这种情况下,valueset 可以是字符串数组或字符向量元胞数组。

categorical 会删除作为字符串或字符向量的 valueset 元素中的前导和尾部空格。

类别名称,指定为字符向量元胞数组或字符串数组。如果不指定 catnames 输入参数,categorical 将使用 valueset 中的值作为类别名称。

要将 A 中多个不同的值合并为 B 中的单个类别,请包括与这些值对应的、完全一样的名称。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'Ordinal',true 指定类别具有数学排序方式。

有序变量指示符,指定为以逗号分隔的对组,其中包含 'Ordinal'false (0) 或 true (1)。

false (0)

categorical 创建一个无序的分类数组,此为默认行为。

B 的类别没有数学排序方式。因此,您只能比较 B 中的值是否相等。您无法使用任何其他关系运算符来比较这些值。

true (1)

categorical 创建一个有序分类数组。

B 的类别具有数学排序方式,这样指定的第一个类别是最小的类别,最后一个类别是最大的类别。除了比较值的相等性之外,您还可以使用关系运算符比较 B 中的值,例如小于和大于。还可以对有序分类数组使用 minmax 函数。

有关详细信息,请参阅 有序分类数组

受保护类别指示符,指定为以逗号分隔的对组,其中包含 'Protected'false (0) 或 true (1)。有序分类数组的类别始终受保护。当您指定 'Ordinal',true 时,默认值为 true。否则,值为 false

false (0)

在向 B 赋新值时,类别会自动更新。因此,您可以合并具有不同类别的(非有序)分类数组。类别会相应更新以包括两个数组中的类别。

true (1)

在向 B 赋新值时,这些值必须属于现有类别之一。因此,只能合并具有相同类别的数组。要向 B 添加新类别,必须使用 addcats 函数。

示例

全部折叠

创建一个包含气象站标签的分类数组。将其添加到温度读数表中。然后使用类别按气象站选择温度读数。

首先,创建包含温度读数、日期和气象站标签的数组。

Temps = [58; 72; 56; 90; 76];
Dates = {'2017-04-17';'2017-04-18';'2017-04-30';'2017-05-01';'2017-04-27'};
Stations = {'S1';'S2';'S1';'S3';'S2'};

Stations 转换为分类数组。

Stations = categorical(Stations)
Stations = 5x1 categorical
     S1 
     S2 
     S1 
     S3 
     S2 

显示类别。三个气象站标签为类别。

categories(Stations)
ans = 3x1 cell
    {'S1'}
    {'S2'}
    {'S3'}

创建包含温度、日期和气象站标签的表。

T = table(Temps,Dates,Stations)
T=5×3 table
    Temps        Dates         Stations
    _____    ______________    ________

     58      {'2017-04-17'}       S1   
     72      {'2017-04-18'}       S2   
     56      {'2017-04-30'}       S1   
     90      {'2017-05-01'}       S3   
     76      {'2017-04-27'}       S2   

显示从气象站 S2 获得的读数。您可以使用 == 运算符找出等于 S2Station 的值。然后使用逻辑索引选择包含气象站 S2 的数据的表行。

TF = (T.Stations == 'S2');
T(TF,:)
ans=2×3 table
    Temps        Dates         Stations
    _____    ______________    ________

     72      {'2017-04-18'}       S2   
     76      {'2017-04-27'}       S2   

将字符向量元胞数组 A 转换为分类数组。指定包括 A 中不存在的值的类别列表。

创建字符向量元胞数组。

A = {'republican' 'democrat'; 'democrat' 'democrat'; 'democrat' 'republican'};

A 转换为分类数组。添加 independent 的类别。

valueset = {'democrat' 'republican' 'independent'};
B = categorical(A,valueset)
B = 3x2 categorical
     republican      democrat   
     democrat        democrat   
     democrat        republican 

显示 B 的类别。

categories(B)
ans = 3x1 cell
    {'democrat'   }
    {'republican' }
    {'independent'}

创建一个数值数组。

A = [1 3 2; 2 1 3; 3 1 2]
A = 3×3

     1     3     2
     2     1     3
     3     1     2

A 转换为分类数组 B 并指定类别名称。

B = categorical(A,[1 2 3],{'red' 'green' 'blue'})
B = 3x3 categorical
     red        blue      green 
     green      red       blue  
     blue       red       green 

显示 B 的类别。

categories(B)
ans = 3x1 cell
    {'red'  }
    {'green'}
    {'blue' }

B 不是有序的分类数组。因此,您只能使用相等运算符 ==~= 比较 B 中的值。

找出属于类别 'red' 的元素。使用逻辑索引访问这些元素。

TF = (B == 'red');
B(TF)
ans = 3x1 categorical
     red 
     red 
     red 

创建一个 5×2 的数值数组。

A = [3 2;3 3;3 2;2 1;3 2]
A = 5×2

     3     2
     3     3
     3     2
     2     1
     3     2

A 转换为有序分类数组,其中 123 分别表示类别 childadultsenior

valueset = [1:3];
catnames = {'child' 'adult' 'senior'};

B = categorical(A,valueset,catnames,'Ordinal',true)
B = 5x2 categorical
     senior      adult  
     senior      senior 
     senior      adult  
     adult       child  
     senior      adult  

由于 B 是有序数组,B 的类别具有数学排序方式 child < adult < senior

您可以通过创建一个 NaN 数组并将其转换为分类数组来预分配任意大小的分类数组。预分配数组后,可以通过指定类别名称并将类别添加到数组来初始化其类别。

首先创建一个 NaN 数组。您可以创建任意大小的数组。例如,创建一个由 NaN 值组成的 2×4 数组。

A = NaN(2,4)
A = 2×4

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

然后通过转换 NaN 数组来预分配分类数组。categorical 函数将 NaN 转换为未定义的分类值。正如 NaN 表示“不是数字”,<undefined> 表示不属于某个类别的分类值。

A = categorical(A)
A = 2x4 categorical
     <undefined>      <undefined>      <undefined>      <undefined> 
     <undefined>      <undefined>      <undefined>      <undefined> 

事实上,此时 A 没有类别。

categories(A)
ans =

  0x0 empty cell array

要初始化 A 的类别,请指定类别名称,并使用 addcats 函数将它们添加到 A 中。例如,添加 smallmediumlarge 作为 A 的三个类别。

A = addcats(A,["small","medium","large"])
A = 2x4 categorical
     <undefined>      <undefined>      <undefined>      <undefined> 
     <undefined>      <undefined>      <undefined>      <undefined> 

虽然 A 的元素是未定义的值,但类别已由 addcats 初始化。

categories(A)
ans = 3x1 cell
    {'small' }
    {'medium'}
    {'large' }

现在 A 已经有了类别,您可以将定义的分类值指定为 A 的元素。

A(1) = "medium";
A(8) = "small";
A(3:5) = "large"
A = 2x4 categorical
     medium           large      large            <undefined> 
     <undefined>      large      <undefined>      small       

从 R2017a 开始,您可以使用双引号来创建字符串数组。而且,字符串数组可以包含缺失值,显示为 <missing>,不带双引号。

str = ["plane","jet","plane","helicopter",missing,"jet"]
str = 1x6 string
    "plane"    "jet"    "plane"    "helicopter"    <missing>    "jet"

将字符串数组 str 转换为分类数组。categorical 函数可将缺失的字符串转换为未定义的分类值,显示为 <undefined>

C = categorical(str)
C = 1x6 categorical
     plane      jet      plane      helicopter      <undefined>      jet 

使用 discretize 函数(而不是 categorical)将 100 个随机数划分为三个类别。

x = rand(100,1);
y = discretize(x,[0 .25 .75 1],'categorical',{'small','medium','large'});
summary(y)
     small       22 
     medium      46 
     large       32 

提示

  • 有关接受或返回分类数组的函数列表,请参阅分类数组

  • 如果输入数组包含的数值、日期时间或持续时间值太接近,则 categorical 函数会将它们截断成重复值。例如,categorical([1 1.00001]) 将截断输入数组的第二个元素。要从数值数据创建类别,请使用 discretize 函数。

备选方法

您也可以使用 discretize 将数值数据分组到不同的类别中。

扩展功能

基于线程的环境
使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

版本历史记录

在 R2013b 中推出