创建分类数组
此示例说明如何从各种类型的输入数据创建分类数组并修改它们的元素。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
。
将字符串数组转换为有序分类数组。按该顺序将类别定义为 small
、medium
和 large
。对于有序分类数组,所指定的第一个类别是最小的,最后一个类别是最大的。
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)
binnedData: 100x1 ordinal categorical small 30 medium 35 large 35 <undefined> 0 Additional statistics: Min small Median medium Max large
您可以生成分 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
函数将 small
、medium
和 large
类别添加到 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
另请参阅
categorical
| categories
| discretize
| summary
| addcats
| missing