保護された categorical 配列の操作
この例では、保護されたカテゴリを含む categorical 配列を操作する方法を示します。
関数 categorical を使用して categorical 配列を作成する場合、カテゴリを保護するかどうかを指定することができます。順序 categorical 配列では常にカテゴリが保護されますが、名前と値の引数 Protected を使用して、保護された非順序 categorical 配列を作成することもできます。
カテゴリのメンバーではない値を代入すると、配列が自動的に更新され、その新しい値がカテゴリのリストに含まれます。同様に、異なるカテゴリをもつ (非順序) categorical 配列を結合することができます。その結果作成されるカテゴリには両方の配列のカテゴリが含まれます。
新しい値を "保護された" categorical 配列に代入する場合、その値は既存のいずれかのカテゴリに属していなければなりません。同様に、保護された配列は共に同じカテゴリをもっていなければ結合できません。
2 つの順序 categorical 配列 (カテゴリは常に保護) を結合する場合は、それらの配列のカテゴリが順序を含めて同じでなければなりません。結果として作成される categorical 配列では 1 番目の配列のカテゴリ順序が使用されます。
2 つの順序 categorical 配列 (カテゴリは常に保護) を結合する場合は、それらの配列のカテゴリが順序を含めて同じでなければなりません。
新しいカテゴリを配列に追加するためには、addcats 関数を使用しなければなりません。
順序 categorical 配列の作成
10 個のオブジェクトのサイズを含む categorical 配列を作成します。値 "S"、"M" および "L" に対して、カテゴリ名 small、medium および large を使用します。
A = categorical(["M";"L";"S";"S";"M";"L";"M";"L";"M";"S"], ... ["S" "M" "L"], ... ["small" "medium" "large"], ... "Ordinal",true)
A = 10×1 categorical
medium
large
small
small
medium
large
medium
large
medium
small
A のカテゴリを表示します。
categories(A)
ans = 3×1 cell
{'small' }
{'medium'}
{'large' }
カテゴリが保護されていることの確認
順序 categorical 配列を作成する場合、カテゴリは常に保護されます。
関数 isprotected を使用して、A のカテゴリが保護されていることを確認します。
tf = isprotected(A)
tf = logical
1
A のカテゴリは保護されています。
新しいカテゴリでの値の代入
既存のどのカテゴリにも属していない新しい値を代入しようとすると、MATLAB® はエラーを返します。たとえば、式 A(2) = "xlarge" のように、値 "xlarge" を categorical 配列に代入することはできません。xlarge は A のカテゴリではないからです。代わりに、MATLAB は以下のエラーを返します。
Error using () (line 57) Cannot add a new category 'xlarge' to this categorical array because its categories are protected. Use ADDCATS to add the new category.
xlarge の新しいカテゴリを追加するには、関数 addcats を使用します。A は順序配列であるため、新しいカテゴリの順序を指定しなければなりません。
A = addcats(A,"xlarge",After="large");
これで、"xlarge" に既存のカテゴリができたので、値を代入します。
A(2) = "xlarge"A = 10×1 categorical
medium
xlarge
small
small
medium
large
medium
large
medium
small
A は、small < medium < large < xlarge である 4 つのカテゴリを含む 10 行 1 列の categorical 配列になりました。
2 つの順序 categorical 配列の結合
5 つの項目のサイズを含む別の順序 categorical 配列 B を作成します。
B = categorical([2;1;1;2;2],1:2,["xsmall" "small"],Ordinal=true)
B = 5×1 categorical
small
xsmall
xsmall
small
small
B は、5 行 1 列の categorical 配列で、xsmall < small である 2 つのカテゴリを含んでいます。
2 つの順序 categorical 配列 (カテゴリは常に保護) を結合する場合は、それらの配列のカテゴリが順序を含めて同じでなければなりません。
カテゴリ xsmall を A のカテゴリ small の前に追加します。
A = addcats(A,"xsmall",Before="small"); categories(A)
ans = 5×1 cell
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
カテゴリ medium、large、および xlarge を B のカテゴリ small の後に追加します。
B = addcats(B,["medium" "large" "xlarge"],After="small"); categories(B)
ans = 5×1 cell
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
これで、A および B のカテゴリが、順序を含めて同じになりました。
A と B を垂直方向に連結します。
C = [A;B]
C = 15×1 categorical
medium
xlarge
small
small
medium
large
medium
large
medium
small
small
xsmall
xsmall
small
small
B の値が A の値に追加されます。
C のカテゴリを一覧表示します。
categories(C)
ans = 5×1 cell
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
C は、xsmall < small < medium < large < xlarge である 5 つのカテゴリを含む 16 行 1 列の順序 categorical 配列です。
参考
categorical | categories | summary | isprotected | isordinal | addcats