メインコンテンツ

混在データの table

関連するデータを 1 つのコンテナーに格納

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

table は、行と列方向の変数で構成されます。table 内の変数は、データ型やサイズが異なってもかまいませんが、変数の行数は同じでなければなりません。また、変数内のデータは同種であるため、table 変数はデータの配列のように扱うことができます。

たとえば、patients.mat MAT ファイルから患者についてのサンプル データを読み込みます。血圧のデータを 1 つの変数に結合します。PoorFairGoodExcellent の値をもつ SelfAssessedHealthStatus という 4 カテゴリの変数を categorical 配列に変換します。変数のいくつかに関する情報を表示します。

load patients
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               624  categorical              
  Smoker                        100x1               100  logical                  

次に、それらの変数から table を作成して表示します。これらの変数は、行数がいずれも 100 で同じであるため、1 つの 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 内の各変数のデータ型は 1 つです。新しい行を 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 内のデータのサブセットを選択して、テーブル コンテナーを保持することができます。中かっこおよびドット表記を使用すると、データを 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  

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)
T: 100×4 table

Description: Simulated Patient Data

Variables:

    Age: double (Yrs)
    Smoker: logical (34 true, true or false)
    BloodPressure: 2-column double (Systolic/Diastolic)
    SelfAssessedHealthStatus: categorical (4 categories, Status Reported by Patient)

Statistics for applicable variables:

                                NumMissing      Min        Median         Max          Mean           Std    

    Age                             0            25             39         50         38.2800        7.2154  
    BloodPressure(:,1)              0           109            122        138        122.7800        6.7128  
    BloodPressure(:,2)              0            68        81.5000         99         82.9600        6.9325  
    SelfAssessedHealthStatus        0                                                                        

cell 配列との比較

table と同じように、cell 配列でも異なるタイプのデータを 1 つのコンテナーに格納することができます。ただし、table と異なり、cell 配列にはその内容を説明するメタデータはありません。列内のデータが強制的に同種になることはありません。cell 配列の内容に行名や列名を使用してアクセスすることはできません。

たとえば、関数 table2cell を使用して T を cell 配列に変換します。出力 cell 配列には同じデータが含まれますが、そのデータに関する情報はありません。データに付加されたそのような情報を維持することが重要な場合は、cell 配列に格納するよりも table に格納する方が適しています。

C = table2cell(T)
C=100×4 cell array
    {[38]}    {[1]}    {[124 93]}    {[Excellent]}
    {[43]}    {[0]}    {[109 77]}    {[Fair     ]}
    {[38]}    {[0]}    {[125 83]}    {[Good     ]}
    {[40]}    {[0]}    {[117 75]}    {[Fair     ]}
    {[49]}    {[0]}    {[122 80]}    {[Good     ]}
    {[46]}    {[0]}    {[121 70]}    {[Good     ]}
    {[33]}    {[1]}    {[130 88]}    {[Good     ]}
    {[40]}    {[0]}    {[115 82]}    {[Good     ]}
    {[28]}    {[0]}    {[115 78]}    {[Excellent]}
    {[31]}    {[0]}    {[118 86]}    {[Excellent]}
    {[45]}    {[0]}    {[114 77]}    {[Excellent]}
    {[42]}    {[0]}    {[115 68]}    {[Poor     ]}
    {[25]}    {[0]}    {[127 74]}    {[Poor     ]}
    {[39]}    {[1]}    {[130 95]}    {[Excellent]}
    {[36]}    {[0]}    {[114 79]}    {[Good     ]}
    {[48]}    {[1]}    {[130 92]}    {[Good     ]}
      ⋮

cell 配列内のデータのサブセットにアクセスするときは、小かっこまたは中かっこによるインデックス付けのみを使用できます。

C(1:5,1:3)
ans=5×3 cell array
    {[38]}    {[1]}    {[124 93]}
    {[43]}    {[0]}    {[109 77]}
    {[38]}    {[0]}    {[125 83]}
    {[40]}    {[0]}    {[117 75]}
    {[49]}    {[0]}    {[122 80]}

構造体との比較

構造体にも異なるタイプのデータを格納できます。table 変数に名前でアクセスできるのと同じように、構造体には名前でアクセスできるフィールドがあります。ただし、フィールド内データが強制的に同種になることはありません。構造体には、その内容を説明するメタデータはありません。

たとえば、T をスカラー構造体に変換します。この構造体はすべてのフィールドが配列で、table 変数と似たような形になります。関数 table2struct を名前と値の引数 ToScalar と共に使用します。

S = table2struct(T,ToScalar=true)
S = struct with fields:
                         Age: [100×1 double]
                      Smoker: [100×1 logical]
               BloodPressure: [100×2 double]
    SelfAssessedHealthStatus: [100×1 categorical]

この構造体では、フィールド名を使用してデータの配列にアクセスできます。

S.Age
ans = 100×1

    38
    43
    38
    40
    49
    46
    33
    40
    28
    31
    45
    42
    25
    39
    36
      ⋮

ただし、フィールド内のデータのサブセットにアクセスするときは、数値インデックスのみを使用でき、アクセスできるフィールドは一度に 1 つだけになります。table の行と変数によるインデックス付けの方が table のデータに柔軟にアクセスできます。

S.Age(1:5)
ans = 5×1

    38
    43
    38
    40
    49

参考

| | | |

トピック