table および timetable 演算での行ラベルの使用
table や timetable には、データ内の行にラベルを付ける方法が用意されています。table では、行に名前でラベルを付けることができます。timetable では、日付と時刻のいずれかまたは両方によって行にラベルを付けなければなりません。table の行名はオプションですが、timetable の行時間は必須です。これらの行ラベルは、table または timetable のメタデータの一部です。一部の関数では、table または timetable でデータ変数を使用できるのと同じように、行ラベルをキー変数やグループ化変数などとして使用することもできます。これに該当する関数は、sortrows、join、innerjoin、outerjoin、varfun、rowfun、stack および 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.DimensionNamesans = 1×2 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
グループ化変数またはキー変数としての行ラベルの使用
関数 rowfun、varfun、stack および unstack を使用して行をグループ化するときは、行ラベルをグループ化変数として指定できます。関数 join、innerjoin および 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 = 1×2 cell
{'Row'} {'Variables'}
Properties.DimensionNames プロパティを使用して、table の最初の次元の名前を変更します。次に、新しい名前をキー変数として使用します。
A.Properties.DimensionNames{1} = 'LastName';
A.Properties.DimensionNamesans = 1×2 cell
{'LastName'} {'Variables'}
LastName および FirstName をキー変数として使用して、A と B で内部連結を実行します。
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 の場合、関数
join、innerjoinまたはouterjoinを使用して連結を実行することはできません。ただし、両方の引数が table の場合、両方が timetable の場合、または最初の引数が timetable で 2 番目が table の場合は、連結を実行できます。行ラベルをキー変数として指定する場合は、連結操作の出力に行ラベルを含めることができます。連結操作の行ラベルの詳細については、関数
join、innerjoinおよびouterjoinの引数'Keys'、'LeftKeys'および'RightKeys'に関するドキュメンテーションを参照してください。
参考
sortrows | join | innerjoin | outerjoin | varfun | rowfun | stack | unstack