本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

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 中的单个类别,请包括与这些值对应的、完全一样的名称。

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: '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 array
     S1 
     S2 
     S1 
     S3 
     S2 

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

categories(Stations)
ans = 3x1 cell array
    {'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 array
     republican      democrat   
     democrat        democrat   
     democrat        republican 

显示 B 的类别。

categories(B)
ans = 3x1 cell array
    {'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 array
     red        blue      green 
     green      red       blue  
     blue       red       green 

显示 B 的类别。

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

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

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

TF = (B == 'red');
B(TF)
ans = 3x1 categorical array
     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 array
     senior      adult  
     senior      senior 
     senior      adult  
     adult       child  
     senior      adult  

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

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

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

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

C = categorical(str)
C = 1x6 categorical array
     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 将数值数据分组到不同的类别中。

扩展功能

在 R2013b 中推出