Main Content

创建分类数组

此示例说明如何从各种类型的输入数据创建分类数组并修改它们的元素。categorical 数据类型存储来自一个离散类别有限集合的值。您可以基于数值数组、逻辑数组、字符串数组或字符向量元胞数组创建一个分类数组。输入数组中的唯一值成为该分类数组的类别。分类数组可用来有效地存储并方便地处理数据,同时还为数值赋予有意义的名称。

默认情况下,分类数组的类别不采用数学排序。例如,离散的宠物类别集合 ["dog","cat","bird"] 无有意义的数学排序,因此 MATLAB® 使用字母排序 ["bird","cat","dog"]。但是,您也可以创建有序分类数组,其中的类别采用有意义的数学排序。例如,离散的大小类别集合 ["small","medium","large"] 可以采用 small < medium < large 的数学排序。有序分类数组使您能够在其元素之间进行比较。

从输入数组创建分类数组

要从输入数组创建分类数组,请使用 categorical 函数。

例如,创建一个字符串数组,其元素是新英格兰的所有州。请注意,有些字符串具有前导空格和尾随空格。

statesNE = ["MA","ME"," CT","VT"," ME ","NH","VT","MA","NH","CT","RI "]
statesNE = 1x11 string
    "MA"    "ME"    " CT"    "VT"    " ME "    "NH"    "VT"    "MA"    "NH"    "CT"    "RI "

将此字符串数组转换为分类数组。当您基于字符串数组(或字符向量元胞数组)创建分类数组时,前导空格和尾随空格将被删除。

statesNE = categorical(statesNE)
statesNE = 1x11 categorical
     MA      ME      CT      VT      ME      NH      VT      MA      NH      CT      RI 

使用 categories 函数列出 statesNE 的类别。statesNE 的每个元素都属于这些类别之一。由于 statesNE 有六个唯一州,因此有六个类别。这些类别是按字母顺序列出的,因为州的缩写没有采用数学排序。

categories(statesNE)
ans = 6x1 cell
    {'CT'}
    {'MA'}
    {'ME'}
    {'NH'}
    {'RI'}
    {'VT'}

添加和修改元素

要向分类数组中添加一个元素,可以赋予表示类别名称的文本。例如,将一个州添加到 statesNE

statesNE(12) = "ME"
statesNE = 1x12 categorical
     MA      ME      CT      VT      ME      NH      VT      MA      NH      CT      RI      ME 

要添加或修改多个元素,必须对一个分类数组赋值。

statesNE(1:3) = categorical(["RI","VT","MA"])
statesNE = 1x12 categorical
     RI      VT      MA      VT      ME      NH      VT      MA      NH      CT      RI      ME 

将缺失值作为未定义元素添加

您可以将缺失值指定为分类数组的未定义元素。未定义的分类值不属于任何类别,类似于数值数组中的 NaN(非数字)。

要赋予缺失值,请使用 missing 函数。例如,将分类数组的第一个元素修改为缺失值。

statesNE(1) = missing
statesNE = 1x12 categorical
     <undefined>      VT      MA      VT      ME      NH      VT      MA      NH      CT      RI      ME 

在分类数组的末尾分配两个缺失值。

statesNE(12:13) = [missing missing]
statesNE = 1x13 categorical
     <undefined>      VT      MA      VT      ME      NH      VT      MA      NH      CT      RI      <undefined>      <undefined> 

如果将字符串数组转换为分类数组,则缺失字符串和空字符串将成为分类数组中的未定义元素。如果您转换数值数组,则 NaN 将成为未定义元素。因此,将缺失字符串 ""''NaN 分配给分类数组的元素会将它们转换为未定义的分类值。

statesNE(2) = ""
statesNE = 1x13 categorical
     <undefined>      <undefined>      MA      VT      ME      NH      VT      MA      NH      CT      RI      <undefined>      <undefined> 

基于字符串数组创建有序分类数组

在有序分类数组中,类别的顺序会定义一个数学排序以便进行比较。由于这种数学排序,您可以使用关系运算符比较有序分类数组的元素。您无法比较非有序分类数组的元素。

例如,创建一个包含八个对象大小的字符串数组。

AllSizes = ["medium","large","small","small","medium", ...
            "large","medium","small"];

该字符串数组有三个唯一值:"large""medium""small"。字符串数组没有方便的方法来指示 small < medium < large

将字符串数组转换为有序分类数组。按该顺序将类别定义为 smallmediumlarge。对于有序分类数组,所指定的第一个类别是最小的,最后一个类别是最大的。

valueset = ["small","medium","large"];
sizeOrd = categorical(AllSizes,valueset,"Ordinal",true)
sizeOrd = 1x8 categorical
     medium      large      small      small      medium      large      medium      small 

分类数组 sizeOrd 中值的顺序保持不变。

列出 sizeOrd 中的离散类别。类别的顺序与其数学排序 small < medium < large 匹配。

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

基于分 bin 数值数据创建有序分类数组

如果您有包含连续数值数据的数组,将数值范围指定为类别会很有用。在这种情况下,使用 discretize 函数对数据划分 bin。将类别名称分配给这些 bin。

例如,创建一个由 0 到 50 之间的 100 个随机数组成的向量。

x = rand(100,1)*50
x = 100×1

   40.7362
   45.2896
    6.3493
   45.6688
   31.6180
    4.8770
   13.9249
   27.3441
   47.8753
   48.2444
      ⋮

使用 discretize,通过对 x 的值进行分 bin,创建一个分类数组。将 0 到 15 之间的所有值归入第一个 bin,15 到 35 之间的所有值归入第二个 bin,35 到 50 之间的所有值归入第三个 bin。每个 bin 包括左端点,但不包括右端点,除了最后一个 bin 外。

catnames = ["small","medium","large"];
binnedData = discretize(x,[0 15 35 50],"categorical",catnames)
binnedData = 100x1 categorical
     large 
     large 
     small 
     large 
     medium 
     small 
     small 
     medium 
     large 
     large 
     small 
     large 
     large 
     medium 
     large 
     small 
     medium 
     large 
     large 
     large 
     medium 
     small 
     large 
     large 
     medium 
     large 
     large 
     medium 
     medium 
     small 
      ⋮

binnedData 是一个包含三个类别的有序分类数组,其中 small < medium < large

要显示每个类别中的元素数量,请使用 summary 函数。

summary(binnedData)
     small       30 
     medium      35 
     large       35 

您可以生成分 bin 数据的各种图。例如,生成 binnedData 的饼图。

pie(binnedData)

预分配分类数组

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

例如,创建一个由 NaN 值组成的 2×4 数组。

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

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

然后将 NaN 数组转换为未定义分类值的分类数组。

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

此时,A 没有类别。

categories(A)
ans =

  0x0 empty cell array

使用 addcats 函数将 smallmediumlarge 类别添加到 A 中。

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

虽然 A 的元素仍是未定义的值,但 A 的类别已定义。

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       

另请参阅

| | | | |

相关主题