Main Content

table を使用する利点

混在するデータ型を 1 つのコンテナーに格納できる利便性

データ型 table を使用して、異なるタイプのデータやメタデータ プロパティ (変数名、行名、説明、変数の単位など) を 1 つのコンテナーにまとめることができます。table は、テキスト ファイルまたはスプレッドシートに列として格納されることが多い列方向のデータや表形式のデータに適しています。たとえば、table を使用して、行がそれぞれの観測値を表し、列がそれぞれの測定変数を表す実験データを格納することができます。

table は、列方向の変数と行で構成されます。table 内の各変数は、データ型やサイズが異なってもかまいませんが、行数は同じでなければなりません。

例として、サンプルの患者データを読み込んでみましょう。

load patients

次に、ワークスペース変数 SystolicDiastolic を 1 つの変数 BloodPressure に結合してから、ワークスペース変数 SelfAssessedHealthStatus を文字ベクトルの cell 配列から categorical 配列に変換します。

BloodPressure = [Systolic Diastolic];
SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus);

whos("Age","Smoker","BloodPressure","SelfAssessedHealthStatus")
  Name                            Size            Bytes  Class          Attributes

  Age                           100x1               800  double                   
  BloodPressure                 100x2              1600  double                   
  SelfAssessedHealthStatus      100x1               560  categorical              
  Smoker                        100x1               100  logical                  

変数 AgeBloodPressureSelfAssessedHealthStatus および Smoker は、データ型は異なりますが、行数は同じ 100 であるため、1 つの table に格納できます。

ここで、変数から table を作成し、表示してみましょう。

T = table(Age,Smoker,BloodPressure,SelfAssessedHealthStatus)
T=100×4 table
    Age    Smoker    BloodPressure    SelfAssessedHealthStatus
    ___    ______    _____________    ________________________

    38     true       124     93             Excellent        
    43     false      109     77             Fair             
    38     false      125     83             Good             
    40     false      117     75             Fair             
    49     false      122     80             Good             
    46     false      121     70             Good             
    33     true       130     88             Good             
    40     false      115     82             Good             
    28     false      115     78             Excellent        
    31     false      118     86             Excellent        
    45     false      114     77             Excellent        
    42     false      115     68             Poor             
    25     false      127     74             Poor             
    39     true       130     95             Excellent        
    36     false      114     79             Good             
    48     true       130     92             Good             
      ⋮

table は、変数名が最上部に示されている表形式で表示されます。

table 内の各変数のデータ型は単一です。新しい行を table に追加すると、MATLAB® では、新しいデータと対応する table 変数とでデータ型の一貫性が強制されます。たとえば、新しい患者について、式 T(end+1,:) = {"Poor",true,[130 84],37} のように、最初の列に患者の年齢ではなく健康状態が含まれている情報を追加しようとすると、次のエラーが出力されます。

Right hand side of an assignment to a categorical array must be a categorical or text representing a category name.

このエラーは、MATLAB® で数値データ 37 を categorical 配列 SelfAssessedHealthStatus に代入できないために発生します。

table と構造体を比較する場合は、table T と同等の構造体配列 StructArray を使用することを検討してください。

StructArray = table2struct(T)
StructArray=100×1 struct array with fields:
    Age
    Smoker
    BloodPressure
    SelfAssessedHealthStatus

構造体配列では、名前付きフィールドを使用してレコードが整理されます。各フィールドの値は、データ型やサイズが異なってもかまいません。ここで、StructArray の最初の要素の名前付きフィールドを表示してみましょう。

StructArray(1)
ans = struct with fields:
                         Age: 38
                      Smoker: 1
               BloodPressure: [124 93]
    SelfAssessedHealthStatus: Excellent

構造体配列内のフィールドは、table 内の変数に類似しています。ただし、table とは異なり、フィールド内の均一性を強制することはできません。たとえば、S.SelfAssessedHealthStatus のいくつかの値が PoorGood などの categorical 配列の要素になり、その他の値が "Poor""Good" などのストリングになり、さらにその他の値が 01 などの整数になる場合があります。

それでは、"スカラー" 構造体に格納されている同じデータについて考えてみましょう。この構造体の 4 つのフィールドには、それぞれ table 変数が 1 つずつ含まれています。

ScalarStruct = struct(...
    "Age",Age,...
    "Smoker",Smoker,...
    "BloodPressure",BloodPressure,...
    "SelfAssessedHealthStatus",SelfAssessedHealthStatus)
ScalarStruct = struct with fields:
                         Age: [100x1 double]
                      Smoker: [100x1 logical]
               BloodPressure: [100x2 double]
    SelfAssessedHealthStatus: [100x1 categorical]

table とは異なり、データは必ずしも四角形にすることはできません。たとえば、フィールド ScalarStruct.Age の長さが他のフィールドと異なる場合があります。

table を使用すると、(構造体配列のように) 四角形構造体を維持しながら、(スカラー構造体のフィールドのように) 変数の均一性を強制することができます。cell 配列には、名前付きフィールドはありませんが、構造体配列やスカラー配列と同じ欠点が多数あります。四角形のデータでそれぞれの変数に 1 つのタイプのみが含まれている場合は、table を使用することを検討してください。そうすれば、数値インデックスまたは名前付きインデックスを使用することができ、table プロパティを使用してメタデータを格納することができます。

数値インデックスまたは名前付きインデックスによるデータへのアクセス

小かっこ、中かっこ、ドット インデックスのいずれかを使用して、table にインデックスを付けることができます。小かっこを使用すると、table 内のデータのサブセットを選択して、テーブル コンテナーを保持することができます。中かっこおよびドット インデックスを使用すると、データを table から抽出することができます。それぞれの table インデックス方法で、行または変数を指定して、名前または数値インデックスによってデータにアクセスすることができます。

上記のサンプル table について考えてみましょう。table T 内の各行は、異なる患者を表します。ワークスペース変数 LastName には 100 行分の一意の識別子が含まれています。RowNames プロパティを LastName に設定して行名を table に追加してから、更新された table の最初の 5 行を表示します。

T.Properties.RowNames = LastName;
T(1:5,:)
ans=5×4 table
                Age    Smoker    BloodPressure    SelfAssessedHealthStatus
                ___    ______    _____________    ________________________

    Smith       38     true       124     93             Excellent        
    Johnson     43     false      109     77             Fair             
    Williams    38     false      125     83             Good             
    Jones       40     false      117     75             Fair             
    Brown       49     false      122     80             Good             

データにラベルを付けるだけでなく、行名や変数名を使用して table 内のデータにアクセスすることができます。たとえば、名前付きインデックスを使用して、患者 Williams および Brown の年齢と血圧を表示します。

T(["Williams","Brown"],["Age","BloodPressure"])
ans=2×2 table
                Age    BloodPressure
                ___    _____________

    Williams    38      125     83  
    Brown       49      122     80  

ここで、数値インデックスを使用して同等のサブテーブルが返されるようにします。1 番目と 3 番目の変数から 3 番目と 5 番目の行が返されるようにします。

T([3 5],[1 3])
ans=2×2 table
                Age    BloodPressure
                ___    _____________

    Williams    38      125     83  
    Brown       49      122     80  

cell 配列または構造体の場合、名前付きインデックスや数値インデックスと同じような柔軟性はありません。

  • cell 配列の場合、必要な名前付きデータを見つけるには strcmp を使用しなければなりません。その後、配列にインデックスを付けることができます。

  • スカラー構造体または構造体配列の場合、フィールドを番号で参照することはできません。それだけでなく、スカラー構造体の場合は、変数のサブセットや観測値のサブセットを簡単に選択することはできません。構造体配列の場合、観測値のサブセットを選択することはできますが、変数のサブセットを選択することはできません。

  • table の場合、名前付きインデックスや数値インデックスによってデータにアクセスすることができます。さらに、変数のサブセットおよび行のサブセットを簡単に選択することができます。

table インデックス方法の詳細については、table 内のデータへのアクセスを参照してください。

table プロパティによるメタデータの格納

table には、データを格納するだけでなく、変数名、行名、説明、変数の単位などのメタデータを格納するためのプロパティがあります。プロパティにアクセスするには、"T.Properties.PropName" を使用します。ここで、"T" は table の名前、"PropName" は table プロパティの名前です。

たとえば、Age について、table の説明、変数の説明および変数の単位を追加するとします。

T.Properties.Description = "Simulated Patient Data";

T.Properties.VariableDescriptions = ...
    ["" ...
     "true or false" ...
     "Systolic/Diastolic" ...
     "Status Reported by Patient"];

T.Properties.VariableUnits("Age") = "Yrs";

VariableDescriptions 内の個々の空の文字列は、対応する変数に説明がないことを示します。詳細については、tableのプロパティの節を参照してください。

table の概要を出力するには関数 summary を使用します。

summary(T)
Description:  Simulated Patient Data

Variables:

    Age: 100x1 double

        Properties:
            Units:  Yrs
        Values:

            Min          25   
            Median       39   
            Max          50   

    Smoker: 100x1 logical

        Properties:
            Description:  true or false
        Values:

            True        34   
            False       66   

    BloodPressure: 100x2 double

        Properties:
            Description:  Systolic/Diastolic
        Values:
                      Column 1    Column 2
                      ________    ________

            Min         109           68  
            Median      122         81.5  
            Max         138           99  

    SelfAssessedHealthStatus: 100x1 categorical

        Properties:
            Description:  Status Reported by Patient
        Values:

            Excellent       34   
            Fair            15   
            Good            40   
            Poor            11   

構造体および cell 配列にはメタデータを格納するためのプロパティはありません。

参考

|

関連するトピック