Main Content

在表和时间表运算中使用行标签

表和时间表提供了标记数据行的方式。在表中,您可以用名称来标记行。在时间表中,您必须用日期、时间或两者来标记行。行名称对于表是可选的,但行时间对于时间表是必需的。这些行标签是表或时间表中的元数据的一部分。在某些函数中,您还可以将行标签用作键变量、分组变量等,就像您可以使用表或时间表中的数据变量一样。这些函数为 sortrowsjoininnerjoinouterjoinvarfunrowfunstackunstack。使用这些表函数以及将行标签用作键变量存在一些限制。

按行标签进行排序

例如,您可以根据时间表的行时间、根据时间表的一个或多个数据变量或者同时根据行时间和数据变量来对时间表排序。

使用 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.DimensionNames
ans = 1x2 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

按数据变量 XY 排序。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

将行标签用作分组变量或键变量

当您使用 rowfunvarfunstackunstack 函数将行分组在一起时,可以将行标签指定为分组变量。当您使用 joininnerjoinouterjoin 函数将表或时间表联接在一起时,可以将行标签指定为键变量。

例如,您可以将多个行名称和一个表变量同时用作键变量,将两个表内联在一起。内联仅保留键变量匹配的表行。

创建两个包含患者数据的表。表的第一个维度可以包含行名称,用于为行添加标签,但这不是必需的。这里将患者的姓氏指定为这些表的行名称。添加患者的名字作为表变量。

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'。执行与上面相同的内联,但使用不同的名称来引用行名称。

访问 AProperties.DimensionNames 属性以显示其维度名称。

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

使用该表的 Properties.DimensionNames 属性以更改其第一个维度的名称。然后,使用新名称作为键变量。

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

使用 LastNameFirstName 作为键变量,对 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  

使用表函数和行标签的说明

  • 您无法使用 stackunstack 函数来堆叠或分叠行标签。但是,您可以使用行标签作为分组变量。

  • 当第一个参量为表且第二个参量为时间表时,您无法使用 joininnerjoinouterjoin 函数执行联接。但是,当两个参量都为表、两个参量都为时间表或第一个参量为时间表且第二个参量为表时,则可以执行联接。

  • 如果您将行标签指定为键变量,则联接操作的输出可以包含行标签。有关联接操作中的行标签的详细信息,请参阅 joininnerjoinouterjoin 函数的 'Keys''LeftKeys''RightKeys' 参量的相关文档。

另请参阅

| | | | | | |