主要内容

unstack

将来自输入表或时间表的数据分列到输出表或时间表的多个变量中

说明

U = unstack(S,vars,ivar) 将来自输入表或时间表的指定变量的数据分列到输出表或时间表的多个变量中。输入参量 vars 指定要分列的变量。通常,输出包含的变量比输入的变量多,但包含的行数更少。

输入参量 ivar 指定指示变量。在输入的每一行中,指示变量的值指示输出的对应变量。unstack 函数使用匹配指示值聚合数据。然后在输出的变量之间分发聚合值。

默认聚合方法取决于数据类型。例如,默认情况下,unstack 通过对数值数据求和来聚合数值数据。

输入可能包含未指定为 varsivar 的其他变量。unstack 函数对其他变量的处理方式会因表和时间表而不同。

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

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

您不能对表的行名称或时间表的行时间进行分列,也不能将行名称或行时间指定为指示变量。

示例

U = unstack(S,vars,ivar,Name=Value) 可在前面语法中的输入参量外使用一个或多个名称-值参量来指定选项。例如,您可以为输出中的新的分列变量指定变量名称。

示例

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

示例

示例

全部折叠

snowfall.mat 样本文件中载入一个表,该表指示各场暴风雪给各个城镇带来的降雪量。该表针对每场暴风雪包含三个降雪量条目,每个城镇一个。它采用堆叠格式,StormTown 具有 categorical 数据类型。具有 categorical 数据类型的表变量是有用的指示变量和分组变量。

load snowfall.mat
S
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   

将变量 Snowfall 分成三个变量,每个变量对应变量 Town 中指定的一个城镇。输出表为分列格式。U 中的各行包含来自 S 中的行(这些行在分组变量 Storm 中具有相同的值)的数据。Storm 中唯一值的顺序决定了 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    

对于某些类型的分析和显示,分列格式可能更方便。例如,现在可以更直接地绘制每个城镇的降雪量。要绘制每个城镇的降雪量的散点图,请使用 scatter 函数。

scatter(U,"Storm",["Boston" "Natick" "Worcester"])

Figure contains an axes object. The axes object with xlabel Storm contains 3 objects of type scatter.

对数据进行分列运算,并向同一个组中具有相同指示变量值的多行应用聚合函数。还返回索引向量作为第二个参量。使用该参量对原始堆叠输入表进行索引。

stockPricesSmall.mat 样本文件载入一个时间表,该时间表包含两支股票两天内的价格数据。Stock 变量的数据类型为 categorical,因为该时间表具有一组固定的股票名称。

load stockPricesSmall.mat
S
S=11×2 timetable
       Date        Stock     Price
    ___________    ______    _____

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

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

创建一个时间表,其中包含代表每支股票的不同变量,每一天占一行。将 Date(行时间向量)用作分组变量,并指定 mean 作为聚合函数。此操作分列 Price 变量中的价格,按日期对价格进行分组,并计算每支股票每天的均价。

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

    12-Apr-2025    62.27     27.31 
    15-Apr-2025    64.79     26.64 

is = 2×1

     1
     7

第二个输出 is 标识 S 中每个行组的第一个值的索引。例如,日期为 2025 年 4 月 15 日的组的第一个值位于 S 的第七行。

S(is(2),:)
ans=1×2 timetable
       Date        Stock     Price
    ___________    ______    _____

    15-Apr-2025    Stock1    63.85

输入参数

全部折叠

输入表,指定为表或时间表。输入必须包含要分列的数据变量和一个指示变量。其余变量可以被视为分组变量或常变量。

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

示例: U = unstack(S,"Var1","Var2") 使用 Var2 作为指示变量分列 U 的变量 Var1

示例: U = unstack(S,["Var1" "Var3" "Var5"],"Var2") 将变量 Var1Var3Var5 的值分列为多个分列输出变量。输出变量的数目由 Var2 中的唯一值数目确定。

示例: U = unstack(S,1:4,5) 使用第五个值作为指示变量将 U 的前四个变量分列为 S 中的多个变量。

指示变量,指定为字符串标量、字符向量或正整数。ivar 中的值指示输出的哪些变量接受来自输入的分列数据。

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

名称-值参数

全部折叠

Name1=Value1,...,NameN=ValueN 的形式指定可选参量对组,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对参量对组的顺序没有要求。

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

定义输入的行组的分组变量,指定为字符串数组、字符向量、字符向量元胞数组、pattern 标量、正整数、正整数数组或逻辑向量。输入中的每个行组都变成输出中的一行。

如果分组变量有缺失值,则 unstack 将排除输入表的对应行。它对数据进行分组,并对不包含来自这些行的数据的结果进行分列。缺失值可以通过任意数据类型(整数和逻辑数据类型除外)来实现。常用缺失值包括:

  • 数值数组和 duration 数组中的 NaN

  • datetime 数组中的 NaT

  • 字符串数组中的缺失字符串

  • 分类数组中未定义的值

要包含其中的分组变量有缺失值的行,请考虑改用 groupsummary 函数。

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

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

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

组内的常变量,指定为字符串数组、字符向量、字符向量元胞数组、pattern 标量、正整数、正整数数组或逻辑向量。

输出中这些变量的值提取自输入中各组的第一行。

当您指定 ConstantVariables 时,可以包括输入的行名称或行时间。

如果您不指定 ConstantVariables,则 unstack 不会将任何变量视为常变量。

输出中新数据变量的名称,指定为字符串数组或字符向量元胞数组。

如果您不指定 NewDataVariableNames,则 unstack 将根据指示变量 ivar 中值的字符串表示来为输出中的新数据变量创建名称。

要应用于数据变量的聚合函数,指定为函数句柄。unstack 将此函数应用于同一个组中在 ivar 中具有相同值的行。此函数必须将数据值聚合为一个输出值。

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

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

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

如果没有要聚合的数据值,则在分列后将没有与 ivar 的给定指示符值相对应的数据值,unstack 必须在分列后的输出表中填充空元素。在这种情况下,unstack 或者填充缺失值,或者调用用户提供的聚合函数并以空数组作为输入。在后一种情况下,unstack 填充的值取决于聚合函数在没有数据要聚合时返回的内容。

给定指示符值没有数据时的结果

填充插入分列的表的空元素中的值

聚合函数是默认函数之一。

适当数据类型的缺失值,例如 NaNNaT、缺失字符串或未定义的分类值。

聚合函数是用户提供的函数。当给定一个空数组作为输入时,它返回空数组。

适当数据类型的缺失值,例如 NaNNaT、缺失字符串或未定义的分类值。

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

聚合函数是用户提供的函数。当给定一个空数组作为输入时,它返回标量。

从聚合函数返回的标量。

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

聚合函数是用户提供的函数。它返回向量、矩阵或多维数组。

unstack 引发错误。

聚合函数引发错误。

unstack 引发同样的错误。

输出的变量命名规则,指定为 "modify""preserve"

VariableNamingRule 参量指定在输出中命名变量的以下规则。

VariableNamingRule 的值

规则

"modify"(默认值)

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

"preserve"

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

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

  • 重复名称

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

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

  • 长度超过 namelengthmax 值的名称。

输出参量

全部折叠

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

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

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

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

详细信息

全部折叠

提示

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

扩展功能

全部展开

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

版本历史记录

在 R2013b 中推出

全部展开

另请参阅

函数

实时编辑器任务