メインコンテンツ

categorical

カテゴリに割り当てられた値を含む配列

説明

categorical は、HighMedLow などの離散カテゴリの有限集合に値を割り当てるデータ型です。これらのカテゴリには High > Med > Low などの数学的な順序を指定することができますが、必須ではありません。categorical 配列は、非数値データを効率的に格納し操作するのに適しており、値に付けられたわかりやすい名前も維持されます。一般的に、categorical 配列は table の行のグループを定義するために使用します。

作成

categorical 配列を作成するには、次のようにします。

  • 以下に説明するように categorical 関数を使用します。

  • discretize 関数を使用して連続データをビン化します。ビンを categorical 配列として返します。

  • 2 つの categorical 配列を乗算します。この積は、カテゴリが 2 つのオペランドのカテゴリのすべての可能な組み合わせである categorical 配列です。

説明

B = categorical(A) は、入力配列から categorical 配列を作成します。出力配列のカテゴリは、入力配列からの一意の値を並べ替えたものです。

B = categorical(A,valueset) は、valueset の値ごとに 1 つのカテゴリを作成します。B のカテゴリは、valueset の値と同じ順序になります。

valueset を使用して、A には存在しない値のカテゴリを含めることができます。逆に、valueset に存在しない値が A に含まれている場合は、B の対応する要素が定義されません。

B = categorical(A,valueset,catnames) は、valueset のカテゴリ値を catnames の対応する名前と突き合わせて、カテゴリに名前を付けます。

B = categorical(A,___,Name=Value) では、前の構文の入力引数に加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、カテゴリが数学的な順序になることを示すには、Ordinaltrue に設定します。

入力引数

すべて展開する

入力配列。数値配列、logical 配列、categorical 配列、datetime 配列、duration 配列、string 配列、または文字ベクトルの cell 配列として指定します。

categorical 関数は、string または文字ベクトルである入力値から先頭のスペースと末尾のスペースを削除します。

入力 A に欠損値が含まれる場合、出力配列の対応する要素は未定義となり、<undefined> として表示されます。関数 categorical は、次の値を未定義の categorical 値に変換します。

  • 数値配列および duration 配列内の NaN

  • string 配列内の欠損 string (<missing>) または空の string ("")

  • 文字ベクトルの cell 配列内にある空の文字ベクトル ('')

  • datetime 配列内の NaT

  • categorical 配列内の未定義値 (<undefined>)

出力配列には未定義値のカテゴリが含まれません。欠損値または未定義値の明示的なカテゴリを作成するには、catnames に目的のカテゴリ名を含め、さらに欠損値を対応する値として valueset に含めなければなりません。

また、入力 A は次のクラス メソッドをもつオブジェクトの配列にすることもできます。

  • unique

  • eq

カテゴリ。一意の値のベクトルとして指定します。valueset のデータ型と入力配列のデータ型は同じでなければなりません。ただし、入力が string 配列の場合を除きます。その場合、valueset は string 配列または文字ベクトルの cell 配列のいずれかにすることができます。

categorical 関数は、string または文字ベクトルである valueset の要素から先頭のスペースと末尾のスペースを削除します。

カテゴリ名。string 配列または文字ベクトルの cell 配列として指定します。入力引数 catnames を指定しない場合、categoricalvalueset 内の値をカテゴリ名として使用します。

カテゴリ名には、欠損 string (<missing>)、空の string ("")、または空の文字ベクトル ('') を含めることはできません。

入力配列の複数の異なる値を出力配列の 1 つのカテゴリにマージするには、それらの値に対応する重複した名前を含めます。

名前と値の引数

すべて展開する

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: categorical(A,Ordinal=true) は、カテゴリが数学的な順序になることを指定します。

順序変数フラグ。数値または logical 0 (false) または 1 (true) として指定します。

0 (false)

categorical は、順序がない categorical 配列を作成します。これは既定の動作です。

出力配列のカテゴリは数学的な順序ではありません。したがって、出力内の値は等価性についてのみ比較できます。他の関係演算子を使用した値の比較はできません。

1 (true)

categorical は、順序 categorical 配列を作成します。

出力配列のカテゴリは数学的な順序であるため、最初に指定されるカテゴリは最小で、最後のカテゴリは最大になります。出力の値は、値の等価性を比較するだけでなく、< (より小さい) や > (より大きい) などの関係演算子を使用して比較できます。関数 min および max を順序 categorical 配列に対して使用することもできます。

詳細については、順序 categorical 配列を参照してください。

保護カテゴリ フラグ。数値または logical 0 (false) または 1 (true) として指定します。

順序 categorical 配列のカテゴリは常に保護されます。Ordinaltrue に設定すると、Protected の既定値も true になります。それ以外の場合、Protected の既定値は false です。

0 (false)

新しい値を出力配列に代入すると、カテゴリは自動的に更新されます。したがって、異なるカテゴリをもつ (非順序) categorical 配列を組み合わせることができます。それに伴って、両方の配列のカテゴリを含めてカテゴリを更新することができます。

1 (true)

新しい値を出力配列に代入する場合、値は既存のカテゴリの 1 つに属していなければなりません。したがって、同じカテゴリをもつ配列のみを組み合わせることができます。新しいカテゴリを出力に追加するには、関数 addcats を使用しなければなりません。

すべて折りたたむ

気象計コードのリストから categorical 配列を作成します。次に、それを温度測定値の table に追加します。categorical 配列を使用すると、table 内のデータをカテゴリ別に解析できます。

まず、気象計コードの配列を作成します。

Stations = ["S1" "S2" "S1" "S3" "S2"]
Stations = 1×5 string
    "S1"    "S2"    "S1"    "S3"    "S2"

気象計コードから categorical 配列を作成するには、categorical 関数を使用します。

Stations = categorical(Stations)
Stations = 1×5 categorical
     S1      S2      S1      S3      S2 

そのカテゴリを表示します。3 つの気象計コードがカテゴリです。

categories(Stations)
ans = 3×1 cell
    {'S1'}
    {'S2'}
    {'S3'}

次に、気象データを含む table を作成します。この table には、温度、日付、および気象計コードが含まれています。

Temperatures = [58;72;56;90;76];
Dates = datetime(["2017-04-17";"2017-04-18";"2017-04-30";"2017-05-01";"2017-04-27"]);
Stations = Stations';
tempReadings = table(Temperatures,Dates,Stations)
tempReadings=5×3 table
    Temperatures       Dates       Stations
    ____________    ___________    ________

         58         17-Apr-2017       S1   
         72         18-Apr-2017       S2   
         56         30-Apr-2017       S1   
         90         01-May-2017       S3   
         76         27-Apr-2017       S2   

table 内のデータを気象計別に分類します。たとえば、気象計 S2 のデータを含む table の行を返します。StationsS2 に等しいかどうかを示す論理インデックスの配列を使用して table にインデックスを付けます。

TF = (tempReadings.Stations == "S2")
TF = 5×1 logical array

   0
   1
   0
   0
   1

tempReadings(TF,:)
ans=2×3 table
    Temperatures       Dates       Stations
    ____________    ___________    ________

         72         18-Apr-2017       S2   
         76         27-Apr-2017       S2   

気象計に関連付けられたデータのパターンを見つけるために、気象計別の温度測定値の散布図を作成します。

scatter(tempReadings,"Stations","Temperatures","filled")

Figure contains an axes object. The axes object with xlabel Stations, ylabel Temperatures contains an object of type scatter.

string 配列を categorical 配列に変換します。categorical 配列に、元の配列に存在しない値を含むカテゴリのセットが含まれていることを指定します。

まず、繰り返しの値のセットを含む string 配列を作成します。

A = ["red" "blue" "blue" "blue" "blue" "red"]
A = 1×6 string
    "red"    "blue"    "blue"    "blue"    "blue"    "red"

string 配列を categorical 配列に変換します。カテゴリを指定します。カテゴリとして green を含めます。

valueset = ["blue" "red" "green"];
B = categorical(A,valueset)
B = 1×6 categorical
     red      blue      blue      blue      blue      red 

categorical 配列のカテゴリを表示します。入力 string 配列からのものではないカテゴリが含まれています。

categories(B)
ans = 3×1 cell
    {'blue' }
    {'red'  }
    {'green'}

数値配列を作成します。

A = [1 3 2; 2 1 3; 3 1 2]
A = 3×3

     1     3     2
     2     1     3
     3     1     2

数値配列を categorical 配列に変換します。カテゴリの値と名前を指定します。

B = categorical(A,[1 2 3],["red" "green" "blue"])
B = 3×3 categorical
     red        blue      green 
     green      red       blue  
     blue       red       green 

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

categories(B)
ans = 3×1 cell
    {'red'  }
    {'green'}
    {'blue' }

B は順序 categorical 配列でありません。したがって、B 内の値の比較には、等号演算子 == および ~= のみを使用できます。

カテゴリ red に属する要素を検索します。論理インデックス付けを使用してこれらの要素にアクセスします。

TF = (B == "red")
TF = 3×3 logical array

   1   0   0
   0   1   0
   0   1   0

B(TF)
ans = 3×1 categorical
     red 
     red 
     red 

既定では、categorical 関数は欠損値 (NaNNaT、空の string、欠損 string など) を未定義のカテゴリ値に変換します。ただし、categorical を呼び出す際に、欠損値が属するカテゴリを指定できます。

たとえば、空の string と欠損 string を含む string 配列を作成します。

A = ["hi" "lo" missing "" "lo" "lo" "hi"]
A = 1×7 string
    "hi"    "lo"    <missing>    ""    "lo"    "lo"    "hi"

まず、string 配列を、未定義の要素を含む categorical 配列に変換します。

C = categorical(A)
C = 1×7 categorical
     hi      lo      <undefined>      <undefined>      lo      lo      hi 

categories(C)
ans = 2×1 cell
    {'hi'}
    {'lo'}

次に、それを再度変換します。ただし、今回は欠損 string のカテゴリとして INDEF を指定します。

C = categorical(A,["lo" "hi" missing],["lo" "hi" "INDEF"])
C = 1×7 categorical
     hi      lo      INDEF      <undefined>      lo      lo      hi 

categories(C)
ans = 3×1 cell
    {'lo'   }
    {'hi'   }
    {'INDEF'}

欠損 string と空の string の両方のカテゴリとして INDEF を指定します。

C = categorical(A,["lo" "hi" missing ""],["lo" "hi" "INDEF" "INDEF"])
C = 1×7 categorical
     hi      lo      INDEF      INDEF      lo      lo      hi 

categories(C)
ans = 3×1 cell
    {'lo'   }
    {'hi'   }
    {'INDEF'}

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 を順序 categorical 配列に変換します。ここで、123 は、それぞれカテゴリ childadultsenior を表します。

valueset = [1 2 3];
catnames = ["child" "adult" "senior"];
B = categorical(A,valueset,catnames,Ordinal=true)
B = 5×2 categorical
     senior      adult  
     senior      senior 
     senior      adult  
     adult       child  
     senior      adult  

B は順序配列であるため、B のカテゴリは、数学的な順序 child < adult < senior になります。順序カテゴリ値では、すべての関係演算子を使用できます。たとえば、adult より大きい値をもつ要素を返します。

TF = B > "adult"
TF = 5×2 logical array

   1   0
   1   1
   1   0
   0   0
   1   0

B(TF)
ans = 5×1 categorical
     senior 
     senior 
     senior 
     senior 
     senior 

NaN の配列を作成して categorical 配列に変換することにより、任意のサイズの categorical 配列を事前割り当てできます。配列を事前割り当てした後、カテゴリ名を指定してカテゴリを配列に追加することにより、カテゴリを初期化できます。

最初に、NaN の配列を作成します。任意のサイズの配列を作成できます。たとえば、NaN の 2 行 4 列の配列を作成します。

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

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

その後、NaN の配列を変換して、categorical 配列を事前割り当てします。関数 categorical は、NaN を未定義の categorical 値に変換します。NaN が "not a number" (非数) を表すのと同様に、<undefined> はカテゴリに属さない categorical 値を表します。

A = categorical(A)
A = 2×4 categorical
     <undefined>      <undefined>      <undefined>      <undefined> 
     <undefined>      <undefined>      <undefined>      <undefined> 

実際、この時点では A にはカテゴリがありません。

categories(A)
ans =

  0×0 empty cell array

A のカテゴリを初期化するには、関数 addcats を使用して、カテゴリ名を指定し A に追加します。たとえば、smallmedium、および large を、A の 3 つのカテゴリとして追加します。

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

A の要素は未定義値ですが、カテゴリは addcats により初期化されています。

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

A にカテゴリが存在するようになったため、定義済みの categorical 値を A の要素として割り当てることができます。

A(1) = "medium";
A(8) = "small";
A(3:5) = "large"
A = 2×4 categorical
     medium           large      large            <undefined> 
     <undefined>      large      <undefined>      small       

discretize 関数は、連続データからカテゴリを作成する場合、特に間隔の狭い入力値がある場合に推奨されます。2 つの値の間隔が狭いとは、2 つの値の差が約 5e-5 未満の場合を指します。値の間隔が狭い場合、categorical 関数は値から一意のカテゴリ名を作成できません。

100 個の乱数を含む数値配列を作成します。

X = rand(100,1)
X = 100×1

    0.8147
    0.9058
    0.1270
    0.9134
    0.6324
    0.0975
    0.2785
    0.5469
    0.9575
    0.9649
    0.1576
    0.9706
    0.9572
    0.4854
    0.8003
      ⋮

数値を 3 つのカテゴリにビン化するには、discretize を使用します。ビンの境界とビンのカテゴリ名を指定します。

C = discretize(X,[0 .25 .75 1],"categorical",["small" "medium" "large"])
C = 100×1 categorical
     large 
     large 
     small 
     large 
     medium 
     small 
     medium 
     medium 
     large 
     large 
     small 
     large 
     large 
     medium 
     large 
     small 
     medium 
     large 
     large 
     large 
     medium 
     small 
     large 
     large 
     medium 
     large 
     medium 
     medium 
     medium 
     small 
      ⋮

3 つのカテゴリのデータのヒストグラムをプロットします。

histogram(C)

Figure contains an axes object. The axes object contains an object of type categoricalhistogram.

2 つの categorical 配列を乗算すると、結果は新しいカテゴリ セットを含む 1 つの categorical 配列になります。新しいカテゴリは、元の 2 つの categorical 配列のカテゴリから作成されたすべての順序付きペアです。カテゴリの可能なすべての組み合わせのセットは、元の 2 つのカテゴリ セットの "デカルト積" としても知られています。

たとえば、2 つの categorical 配列を作成します。これらの配列には、6 人の患者の血液型と Rh 因子がリストされています。

bloodGroups = categorical(["A" "AB" "O" "O" "A" "A"], ...
                          ["A" "B" "AB" "O"])
bloodGroups = 1×6 categorical
     A      AB      O      O      A      A 

Rhfactors = categorical(["+" "+" "-" "-" "+" "+"])
Rhfactors = 1×6 categorical
     +      +      -      -      +      + 

2 つの配列のカテゴリを表示します。2 つの categorical 配列は、要素数は同じですが、異なる数のカテゴリをもつことができます。

categories(bloodGroups)
ans = 4×1 cell
    {'A' }
    {'B' }
    {'AB'}
    {'O' }

categories(Rhfactors)
ans = 2×1 cell
    {'+'}
    {'-'}

2 つの categorical 配列を乗算します。積の要素は、入力配列の対応する要素の組み合わせから得られます。

bloodTypes = bloodGroups .* Rhfactors
bloodTypes = 1×6 categorical
     A +      AB +      O -      O -      A +      A + 

ただし、積の "カテゴリ" は、2 つの配列のカテゴリから作成できる "すべての" 順序付きペアです。したがって、一部のカテゴリが出力配列のどの要素でも表されない可能性があります。

categories(bloodTypes)
ans = 8×1 cell
    {'A +' }
    {'A -' }
    {'B +' }
    {'B -' }
    {'AB +'}
    {'AB -'}
    {'O +' }
    {'O -' }

制限

  • 入力配列が数値、datetime、または duration の配列であり、入力の値からカテゴリ名を作成した場合、categorical は有効数字 5 桁に丸めます。

    たとえば、categorical([1 1.23456789]) は、これら 2 つの値からカテゴリ名 11.2346 を作成します。連続する数値、duration、または datetime のデータからカテゴリを作成するには、discretize 関数を使用します。

  • 入力配列の数値、datetime、duration の値の間隔が狭すぎる場合、categorical はそれらの値からカテゴリ名を作成できません。一般に、値の間隔が狭すぎるとは、入力内の任意の 2 つの値の差が約 5e-5 未満である場合を指します。

    たとえば、categorical([1 1.00001]) では 2 つの数値の差が小さすぎるため、これらの数値からカテゴリ名を作成できません。連続する数値、duration、または datetime のデータからカテゴリを作成するには、discretize 関数を使用します。

ヒント

  • categorical 配列を受け入れる関数、または返す関数の一覧については、categorical 配列を参照してください。

拡張機能

すべて展開する

スレッドベースの環境
MATLAB® の backgroundPool を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool を使用してコードを高速化します。

バージョン履歴

R2013b で導入