Main Content

保護された categorical 配列の操作

この例では、保護されたカテゴリを含む categorical 配列を操作する方法を示します。

関数 categorical を使用して categorical 配列を作成する場合、カテゴリを保護するかどうかを指定することができます。順序 categorical 配列では常にカテゴリが保護されますが、名前と値のペアの引数 'Protected',true を使用して、保護された非順序 categorical 配列を作成することもできます。

配列のカテゴリのリストにない値を代入すると、配列が自動的に更新され、その新しい値がカテゴリのリストに含まれます。同様に、異なるカテゴリをもつ (非順序) categorical 配列を結合することができます。その結果作成されるカテゴリには両方の配列のカテゴリが含まれます。

新しい値を "保護された" categorical 配列に代入する場合、その値は既存のいずれかのカテゴリに属していなければなりません。同様に、保護された配列は共に同じカテゴリをもっていなければ結合できません。

  • 2 つの順序 categorical 配列 (カテゴリは常に保護) を結合する場合は、それらの配列のカテゴリが順序を含めて同じでなければなりません。結果として作成される categorical 配列では 1 番目の配列のカテゴリ順序が使用されます。

  • 2 つの順序 categorical 配列 (カテゴリは常に保護) を結合する場合は、それらの配列のカテゴリが順序を含めて同じでなければなりません。

新しいカテゴリを配列に追加するためには、関数 addcats を使用しなければなりません。

順序 categorical 配列の作成

10 個のオブジェクトのサイズを含む categorical 配列を作成します。値 'S''M' および 'L' に対して、名前 smallmedium および large を使用します。

A = categorical({'M';'L';'S';'S';'M';'L';'M';'L';'M';'S'},...
                {'S','M','L'},{'small','medium','large'},'Ordinal',true)
A = 10x1 categorical
     medium 
     large 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 

A は 10 行 1 列の categorical 配列です。

A のカテゴリを表示します。

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

カテゴリが保護されていることの確認

順序 categorical 配列を作成する場合、カテゴリは常に保護されます。

関数 isprotected を使用して、A のカテゴリが保護されていることを確認します。

tf = isprotected(A)
tf = logical
   1

A のカテゴリは保護されています。

新しいカテゴリでの値の代入

既存のどのカテゴリにも属していない新しい値を代入しようとすると、MATLAB® はエラーを返します。たとえば、式 A(2) = 'xlarge' のように、値 'xlarge' を categorical 配列に代入することはできません。xlargeA のカテゴリではないからです。代わりに、MATLAB® は以下のエラーを返します。

Error using categorical/subsasgn (line 68)

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 = 10x1 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 = 5x1 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 = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

カテゴリ {'medium','large','xlarge'}B のカテゴリ 'small' の後に追加します。

B = addcats(B,{'medium','large','xlarge'},'After','small');

categories(B)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

これで、A および B のカテゴリが、順序を含めて同じになりました。

AB を垂直方向に連結します。

C = [A;B]
C = 15x1 categorical
     medium 
     xlarge 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 
     small 
     xsmall 
     xsmall 
     small 
     small 

B の値が A の値に追加されます。

C のカテゴリを一覧表示します。

categories(C)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

C は、xsmall < small < medium < large < xlarge である 5 つのカテゴリを含む 16 行 1 列の順序 categorical 配列です。

参考

| | | | |

関連する例

詳細