Main Content

table および timetable 演算での行ラベルの使用

table や timetable には、データ内の行にラベルを付ける方法が用意されています。table では、行に名前でラベルを付けることができます。timetable では、日付と時刻のいずれかまたは両方によって行にラベルを付けなければなりません。table の行名はオプションですが、timetable の行時間は必須です。これらの行ラベルは、table または timetable のメタデータの一部です。一部の関数では、table または timetable でデータ変数を使用できるのと同じように、行ラベルをキー変数やグループ化変数などとして使用することもできます。これに該当する関数は、sortrowsjoininnerjoinouterjoinvarfunrowfunstack および unstack です。これらの table 関数の使用と、キー変数としての行ラベルの使用には、いくつか制限事項があります。

行ラベルを基準とした並べ替え

たとえば timetable は、行時間か、1 つ以上のデータ変数、またはその両方を基準として並べ替えることができます。

関数 timetable を使用して timetable を作成します。timetable では、行時間は最初の次元に沿っており、行のラベルとなります。行時間は、timetable のプロパティであり、timetable 変数ではありません。

Date = datetime(2016,7,[10;10;11;11;10;10;11;11]);
X = [1;1;1;1;2;2;2;2];
Y = {'a';'b';'a';'b';'a';'b';'a';'b'};
Z = [1;2;3;4;5;6;7;8];
TT = timetable(X,Y,Z,'RowTimes',Date)
TT=8×3 timetable
       Time        X      Y      Z
    ___________    _    _____    _

    10-Jul-2016    1    {'a'}    1
    10-Jul-2016    1    {'b'}    2
    11-Jul-2016    1    {'a'}    3
    11-Jul-2016    1    {'b'}    4
    10-Jul-2016    2    {'a'}    5
    10-Jul-2016    2    {'b'}    6
    11-Jul-2016    2    {'a'}    7
    11-Jul-2016    2    {'b'}    8

最初の次元の名前を変更します。既定では、timetable の最初の次元の名前は Time です。Properties.DimensionNames プロパティにアクセスして次元の名前を変更できます。

TT.Properties.DimensionNames{1} = 'Date';
TT.Properties.DimensionNames
ans = 1x2 cell
    {'Date'}    {'Variables'}

代替方法として、'RowTimes' を指定せずに、timetable に対する最初の入力引数として行時間を指定することもできます。関数 timetable は、他の入力引数を使用して timetable 変数に名前を付ける場合と同様に、最初の入力引数を使用して行時間または最初の次元に名前を付けます。

TT = timetable(Date,X,Y,Z)
TT=8×3 timetable
       Date        X      Y      Z
    ___________    _    _____    _

    10-Jul-2016    1    {'a'}    1
    10-Jul-2016    1    {'b'}    2
    11-Jul-2016    1    {'a'}    3
    11-Jul-2016    1    {'b'}    4
    10-Jul-2016    2    {'a'}    5
    10-Jul-2016    2    {'b'}    6
    11-Jul-2016    2    {'a'}    7
    11-Jul-2016    2    {'b'}    8

timetable を行時間で並べ替えます。行時間で並べ替えるには、timetable の最初の次元を名前で参照します。

sortrows(TT,'Date')
ans=8×3 timetable
       Date        X      Y      Z
    ___________    _    _____    _

    10-Jul-2016    1    {'a'}    1
    10-Jul-2016    1    {'b'}    2
    10-Jul-2016    2    {'a'}    5
    10-Jul-2016    2    {'b'}    6
    11-Jul-2016    1    {'a'}    3
    11-Jul-2016    1    {'b'}    4
    11-Jul-2016    2    {'a'}    7
    11-Jul-2016    2    {'b'}    8

データ変数 X および Y で並べ替えます。sortrows は、まず X で並べ替えた後、Y で並べ替えます。

sortrows(TT,{'X' 'Y'})
ans=8×3 timetable
       Date        X      Y      Z
    ___________    _    _____    _

    10-Jul-2016    1    {'a'}    1
    11-Jul-2016    1    {'a'}    3
    10-Jul-2016    1    {'b'}    2
    11-Jul-2016    1    {'b'}    4
    10-Jul-2016    2    {'a'}    5
    11-Jul-2016    2    {'a'}    7
    10-Jul-2016    2    {'b'}    6
    11-Jul-2016    2    {'b'}    8

行時間と X の両方で並べ替えます。

sortrows(TT,{'Date' 'X'})
ans=8×3 timetable
       Date        X      Y      Z
    ___________    _    _____    _

    10-Jul-2016    1    {'a'}    1
    10-Jul-2016    1    {'b'}    2
    10-Jul-2016    2    {'a'}    5
    10-Jul-2016    2    {'b'}    6
    11-Jul-2016    1    {'a'}    3
    11-Jul-2016    1    {'b'}    4
    11-Jul-2016    2    {'a'}    7
    11-Jul-2016    2    {'b'}    8

グループ化変数またはキー変数としての行ラベルの使用

関数 rowfunvarfunstack および unstack を使用して行をグループ化するときは、行ラベルをグループ化変数として指定できます。関数 joininnerjoin および outerjoin を使用して table または timetable を連結するときは、行ラベルをキー変数として指定できます。

たとえば、行名と table 変数を一緒にキー変数として使用すると、2 つの table の内部連結を実行できます。内部連結は、キー変数を基準として一致する table の行のみを維持します。

患者データの table を 2 つ作成します。table に最初の次元に沿って行名を含め、行のラベルとすることができますが、必須ではありません。患者の姓を、table の行名として指定します。患者の名を table 変数として追加します。

A = table({'Michael';'Louis';'Alice';'Rosemary';'Julie'},[38;43;45;40;49],...
    'VariableNames',{'FirstName' 'Age'},...
    'RowNames',{'Garcia' 'Johnson' 'Wu' 'Jones' 'Picard'})
A=5×2 table
                FirstName      Age
               ____________    ___

    Garcia     {'Michael' }    38 
    Johnson    {'Louis'   }    43 
    Wu         {'Alice'   }    45 
    Jones      {'Rosemary'}    40 
    Picard     {'Julie'   }    49 

B = table({'Michael';'Beverly';'Alice'},...
    [64;69;67],...
    [119;163;133],...
    [122 80; 109 77; 117 75],...
    'VariableNames',{'FirstName' 'Height' 'Weight' 'BloodPressure'},...
    'RowNames',{'Garcia' 'Johnson' 'Wu'})
B=3×4 table
                FirstName     Height    Weight    BloodPressure
               ___________    ______    ______    _____________

    Garcia     {'Michael'}      64       119       122     80  
    Johnson    {'Beverly'}      69       163       109     77  
    Wu         {'Alice'  }      67       133       117     75  

table に行名がある場合は、行名によってインデックスを付けることができます。行名によるインデックス付けは、table の行を選択する際に便利です。患者の姓によって B にインデックスを付けて、患者に関する情報を取得します。

B('Garcia',:)
ans=1×4 table
               FirstName     Height    Weight    BloodPressure
              ___________    ______    ______    _____________

    Garcia    {'Michael'}      64       119       122     80  

2 つの table の内部連結を実行します。どちらの table も、患者の姓を行名として使用し、名を table 変数としています。2 つの table には、姓が一致し、名が異なる患者が数名含まれています。姓と名の両方が一致することを確認するには、行名と FirstName をキー変数として使用します。行名をキー変数またはグループ化変数として指定するには、table の最初の次元の名前を使用します。既定では、最初の次元の名前は 'Row' です。

C = innerjoin(A,B,'Keys',{'Row','FirstName'})
C=2×5 table
               FirstName     Age    Height    Weight    BloodPressure
              ___________    ___    ______    ______    _____________

    Garcia    {'Michael'}    38       64       119       122     80  
    Wu        {'Alice'  }    45       67       133       117     75  

table の最初の次元の名前を変更すると、'Row' を使用する代わりに、その名前で行名を参照できます。上記と同じ内部連結を実行します。ただし、今回は別の名前を使用して行名を参照します。

Properties.DimensionNames プロパティにアクセスすることにより、A の次元名を表示します。

A.Properties.DimensionNames
ans = 1x2 cell
    {'Row'}    {'Variables'}

Properties.DimensionNames プロパティを使用して、table の最初の次元の名前を変更します。次に、新しい名前をキー変数として使用します。

A.Properties.DimensionNames{1} = 'LastName';
A.Properties.DimensionNames
ans = 1x2 cell
    {'LastName'}    {'Variables'}

LastName および FirstName をキー変数として使用して、AB で内部連結を実行します。

B.Properties.DimensionNames{1} = 'LastName';
D = innerjoin(A,B,'Keys',{'LastName','FirstName'})
D=2×5 table
               FirstName     Age    Height    Weight    BloodPressure
              ___________    ___    ______    ______    _____________

    Garcia    {'Michael'}    38       64       119       122     80  
    Wu        {'Alice'  }    45       67       133       117     75  

table 関数と行ラベルの使用に関するメモ

  • 関数 stack および unstack を使用して行ラベルをスタックまたはスタック解除することはできません。ただし、行ラベルをグループ化変数として使用することはできます。

  • 最初の引数が table で 2 番目の引数が timetable の場合、関数 joininnerjoin または outerjoin を使用して連結を実行することはできません。ただし、両方の引数が table の場合、両方が timetable の場合、または最初の引数が timetable で 2 番目が table の場合は、連結を実行できます。

  • 行ラベルをキー変数として指定する場合は、連結操作の出力に行ラベルを含めることができます。連結操作の行ラベルの詳細については、関数 joininnerjoin および outerjoin の引数 'Keys''LeftKeys' および 'RightKeys' に関するドキュメンテーションを参照してください。

参考

| | | | | | |