Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

unstack

将单个变量中的数据分叠到多个变量中

说明

示例

U = unstack(S,vars,ivar) 将表或时间表 S 转换为分叠的等同表或时间表 Uvars 指定 S 中的变量,其中每个变量都分叠为 U 中的多个变量。一般来说,US 包含的变量更多,但行更少。

ivar 输入参数指定 S 中被 unstack 用作指示变量的变量。ivar 中的值确定分叠后 U 中有哪些变量包含 vars 中的元素。

unstack 函数对其他变量的处理方式会因表和时间表而不同。

  • 如果 S 是表,则 unstack 将其余的变量视为分组变量。分组变量中各个唯一的值组合标识了 S 中将要分叠到 U 某一行的一组行。

  • 如果 S 是时间表,则 unstack 将丢弃其余的变量。但是,unstack 会将行时间向量视为分组变量。

您不能对表的行名称或时间表的行时间进行分叠,也不能将行名称或行时间指定为指示变量。您可以使用 'ConstantVariables' 参数将行名称或行时间指定为常变量。

U = unstack(S,vars,ivar,Name,Value) 使用一个或多个 Name,Value 对组参数指定的其他选项转换表或时间表 S

例如,您可以指定 unstack 如何将 S 中的变量转换为 U 中的变量。

示例

[U,is] = unstack(___) 还返回索引向量 is,指示 U 中的行与 S 中的行之间的对应关系。您可以使用以前的任何输入参数。

示例

全部折叠

创建一个表,指示各大城镇各种暴风雪天气带来的降雪量。使用一个 categorical 数组指定城镇,因为此表中有一组固定的城镇名称。

Storm = [3;3;1;3;1;1;4;2;4;2;4;2];
Town = categorical({'Natick';'Worcester';'Natick';'Boston';'Boston';'Worcester';...
                    'Boston';'Natick';'Worcester';'Worcester';'Natick';'Boston'});
Snowfall = [0;3;5;5;9;10;12;13;15;16;17;21];

S = table(Storm,Town,Snowfall)
S=12×3 table
    Storm      Town       Snowfall
    _____    _________    ________

      3      Natick           0   
      3      Worcester        3   
      1      Natick           5   
      3      Boston           5   
      1      Boston           9   
      1      Worcester       10   
      4      Boston          12   
      2      Natick          13   
      4      Worcester       15   
      2      Worcester       16   
      4      Natick          17   
      2      Boston          21   

S 针对每种暴风雪天气包含三个降雪量项,每个城镇一个。S 为堆叠格式,Town 具有 categorical 数据类型。具有 categorical 数据类型的表变量是有用的指示变量和用于分叠的分组变量。

将变量 Snowfall 分成三个变量,每个对应变量 Town 中指定的一个城镇。输出表 U 为分叠格式。

U = unstack(S,'Snowfall','Town')
U=4×4 table
    Storm    Boston    Natick    Worcester
    _____    ______    ______    _________

      3         5         0          3    
      1         9         5         10    
      4        12        17         15    
      2        21        13         16    

U 中的各行包含 S 中的行(这些行在分组变量 Storm 中具有相同的值)的数据。Storm 中唯一值的顺序决定了 U 中数据的顺序。

对数据进行分叠运算,并向同一个组中具有相同指示变量值的多行应用聚合函数。

创建一个时间表,其中包含两支股票两天内的价格数据。要指定行时间,请使用 datetime 值。使用 categorical 数组指定股票名称,因为此时间表有一组固定的股票名称。

Date = [repmat(datetime('2008-04-12'),6,1);...
        repmat(datetime('2008-04-13'),5,1)];
Stock = categorical({'Stock1';'Stock2';'Stock1';'Stock2';...
                     'Stock2';'Stock2';'Stock1';'Stock2';...
                     'Stock2';'Stock1';'Stock2'});
Price = [60.35;27.68;64.19;25.47;28.11;27.98;...
         63.85;27.55;26.43;65.73;25.94];

S = timetable(Date,Stock,Price)
S=11×2 timetable
       Date        Stock     Price
    ___________    ______    _____

    12-Apr-2008    Stock1    60.35
    12-Apr-2008    Stock2    27.68
    12-Apr-2008    Stock1    64.19
    12-Apr-2008    Stock2    25.47
    12-Apr-2008    Stock2    28.11
    12-Apr-2008    Stock2    27.98
    13-Apr-2008    Stock1    63.85
    13-Apr-2008    Stock2    27.55
    13-Apr-2008    Stock2    26.43
    13-Apr-2008    Stock1    65.73
    13-Apr-2008    Stock2    25.94

S 包含 Stock1 第一天的两个价格和 Stock2 第一天的四个价格。

创建一个时间表,包含代表每支股票的不同变量,每一天占一行。将 Date(行时间向量)用作分组变量,并向每个组的变量 Price 的数值应用聚合函数 @mean

[U,is] = unstack(S,'Price','Stock',...
                 'AggregationFunction',@mean)
U=2×2 timetable
       Date        Stock1    Stock2
    ___________    ______    ______

    12-Apr-2008    62.27     27.31 
    13-Apr-2008    64.79     26.64 

is = 2×1

     1
     7

U 包含按日期分组的每支股票的平均价格。

is 标识 S 中每个行组的第一个值的索引。日期为 2008 年 4 月 13 日的组的第一个值位于 S 的第七行。

输入参数

全部折叠

输入表,指定为表或时间表。S 必须包含要分叠的数据变量 vars 和指示变量 ivarS 中的其余变量可以视为分组变量或常变量。

S 中要分叠的变量,指定为正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern 标量或逻辑向量。

S 中的指示变量,指定为正整数、字符向量或字符串标量。由 ivar 指定的变量中的值指示 U 中的哪些变量包含由 vars 指定的变量中的元素。

ivar 指定的变量可以是数值向量、逻辑向量、字符数组、字符向量元胞数组、字符串数组或分类向量。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'AggregationFunction',@meanvars 中的值应用聚合函数 @mean

S 中定义行组的分组变量,指定为逗号分隔的对组,包含 'GroupingVariables' 和一个正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern 标量或逻辑向量。S 中的每个行组都将变成 U 中的一行。

S 可以在其第一个维度包含行标签。如果 S 是表,则它可以将行名称作为标签。如果 S 是时间表,则它必须将行时间作为标签。unstack 可以将行标签视为分组变量。

  • 如果您不指定 'GroupingVariables',并且 S 是时间表,则 unstack 会将行时间视为分组变量。

  • 如果您指定了 'GroupingVariables',而 S 又具有行名称或行时间,则 unstack 不会将行名称或行时间视为分组变量,除非您将它们包含在 'GroupingVariables' 的值中。

组内的常变量,指定为逗号分隔的对组,包含 'ConstantVariables' 和一个正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern 标量或逻辑向量。

U 中这些变量的值提取自 S 中各组的第一行。

当您指定 'ConstantVariables' 的值时,可以包括 S 的行名称或行时间。

U 中新数据变量的名称,以逗号分隔的对组形式指定,该对组由 'NewDataVariableNames' 和一个字符向量元胞数组或字符串数组组成。

如果您不指定 'NewDataVariableNames',则 unstack 将根据 ivar 指定的指示变量的值为 U 中的新数据变量创建名称。

vars 中的多个值加总为单个值的聚合函数,以逗号分隔的对组形式指定,该对组由 'AggregationFunction' 和一个函数句柄组成。unstack 将此函数应用于同一个组中具有相同 ivar 值的行。此函数必须将数据值加总成单个值。

如果您没有指定 'AggregationFunction' 的值,则 unstack 会根据数据类型使用不同默认聚合函数。

  • 对于数值数据,默认聚合函数为 sum

  • 对于非数值数据,默认聚合函数为 unique

如果没有要聚合的数据值,则在分叠后将没有与 ivar 的给定指示符值相对应的数据值,unstack 必须在分叠后的输出表中填充空元素。在这种情况下,unstack 使用空数组作为输入调用聚合函数。unstack 填充的值取决于聚合函数在输入为空数组时返回的值。

没有要聚合的数据时聚合函数返回的值

插入分叠的表的空元素中的值

聚合函数引发错误

unstack 引发错误。

空数组

填充适当数据类型的值(NaNNaT"" 等)。

示例:如果聚合函数是 unique,并且它返回 0×0 double 数组,则 unstackNaN 插入输出表。

标量值

从聚合函数返回的标量值。

示例:如果聚合函数是 numel 并且它返回 0,则 unstack0 插入输出表。

向量、矩阵或多维数组

unstack 引发错误。

U 中变量的命名规则,指定为逗号分隔的对组,其中包含 'VariableNamingRule' 和值 'modify''preserve'

'VariableNamingRule' 的值指定以下在输出表或时间表中命名变量的规则。

'VariableNamingRule' 的值

规则

'modify'(默认值)

修改取自输入表或时间表的名称,使输出中对应的变量名称也是有效的 MATLAB® 标识符。

'preserve'

保留取自输入表或时间表的原始名称。输出中对应的变量名称可以包含任何 Unicode® 字符,包括空格和非 ASCII 字符。

注意:在某些情况下,unstack 必须修改原始名称,即使规则为 'preserve' 也是如此。这类情况包括:

  • 重复名称

  • 与表维度名称冲突的名称

  • 与保留名称冲突的名称。

  • 长度超过 namelengthmax 值的名称。

输出参数

全部折叠

输出表,以表或时间表形式返回。U 包含分叠的数据变量、分组变量以及任何常变量中各组的第一个值。

U 中数据的顺序基于分组变量中唯一值的顺序。

您可以在 U 中存储描述、变量单位、变量名称和行名称等附加元数据。有关详细信息,请参阅 tabletimetable 的“属性”部分。

S 的索引,以列向量形式返回。对于 U 中的每一行,索引向量 is 标识了 S 相应行组中的第一个值的索引。

详细信息

全部折叠

分组变量

分组变量是用于对数据进行分组或分类的实用变量。分组变量对于按组对数据进行汇总或可视化十分有用。您可以通过指定一个或多个分组变量来定义表中的组。

分组变量可以是以下任意一种类型:

  • 分类向量

  • 字符向量元胞数组

  • 字符串数组

  • 字符数组

  • 数值向量,通常包含正整数

  • 逻辑向量

具有相同分组变量值的行属于同一个组。如果使用多个分组变量,则具有相同分组变量值组合的行属于同一个组。

提示

  • 您可以指定 S 中的多个数据变量,每个变量都会变成 U 中的一组分叠数据变量。可使用正整数向量、包含多个变量名称的元胞数组或字符串数组或者逻辑向量来指定 vars。输入参数 ivar 指定的一个指示变量适用于 vars 指定的所有数据变量。

扩展功能

基于线程的环境
使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

版本历史记录

在 R2013b 中推出

全部展开

另请参阅

函数

实时编辑器任务