在表和时间表运算中使用行标签
表和时间表提供了标记数据行的方式。在表中,您可以用名称来标记行。在时间表中,您必须用日期、时间或两者来标记行。行名称对于表是可选的,但行时间对于时间表是必需的。这些行标签是表或时间表中的元数据的一部分。在某些函数中,您还可以将行标签用作键变量、分组变量等,就像您可以使用表或时间表中的数据变量一样。这些函数为 sortrows、join、innerjoin、outerjoin、varfun、rowfun、stack 和 unstack。使用这些表函数以及将行标签用作键变量存在一些限制。
按行标签进行排序
例如,您可以根据时间表的行时间、根据时间表的一个或多个数据变量或者同时根据行时间和数据变量来对时间表排序。
使用 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
重命名第一个维度。默认情况下,时间表的第一个维度的名称为 Time。您可以访问 Properties.DimensionNames 属性以重命名维度。
TT.Properties.DimensionNames{1} = 'Date';
TT.Properties.DimensionNamesans = 1×2 cell
{'Date'} {'Variables'}
作为备选方法,您可以将行时间指定为 timetable 的第一个输入参量,而不必指定 'RowTimes'。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
按行时间对时间表排序。要对行时间排序,请按名称引用时间表的第一个维度。
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 函数将表或时间表联接在一起时,可以将行标签指定为键变量。
例如,您可以将多个行名称和一个表变量同时用作键变量,将两个表内联在一起。内联仅保留键变量匹配的表行。
创建两个包含患者数据的表。表的第一个维度可以包含行名称,用于为行添加标签,但这不是必需的。这里将患者的姓氏指定为这些表的行名称。添加患者的名字作为表变量。
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
如果表包含行名称,则可以按行名称对其进行索引。按行名称进行索引是一种选择表行的便捷方式。按某个患者的姓氏对 B 进行索引以检索该患者的相关信息。
B('Garcia',:)ans=1×4 table
FirstName Height Weight BloodPressure
___________ ______ ______ _____________
Garcia {'Michael'} 64 119 122 80
对这两个表执行内联。两个表都使用患者的姓氏作为行名称,并且包含名字作为表变量。这两个表中的某些患者具有匹配的姓氏,但名字不同。要确保姓氏和名字都匹配,请使用行名称和 FirstName 作为键变量。要将行名称指定为键变量或分组变量,请使用表的第一个维度的名称。默认情况下,第一个维度的名称为 '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
如果您重命名表的第一个维度,则可以按该名称来引用行名称,而不是使用 'Row'。执行与上面相同的内联,但使用不同的名称来引用行名称。
访问 A 的 Properties.DimensionNames 属性以显示其维度名称。
A.Properties.DimensionNames
ans = 1×2 cell
{'Row'} {'Variables'}
使用该表的 Properties.DimensionNames 属性以更改其第一个维度的名称。然后,使用新名称作为键变量。
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
使用表函数和行标签的说明
您无法使用
stack和unstack函数来堆叠或分列行标签。但是,您可以使用行标签作为分组变量。当第一个参量为表且第二个参量为时间表时,您无法使用
join、innerjoin或outerjoin函数执行联接。但是,当两个参量都为表、两个参量都为时间表或第一个参量为时间表且第二个参量为表时,则可以执行联接。如果您将行标签指定为键变量,则联接运算的输出可以包含行标签。有关联接运算中的行标签的详细信息,请参阅
join、innerjoin和outerjoin函数的'Keys'、'LeftKeys'和'RightKeys'参量的相关文档。
另请参阅
sortrows | join | innerjoin | outerjoin | varfun | rowfun | stack | unstack