主要内容

stack

将来自输入表或时间表的数据堆叠到输出表或时间表的一个变量中

说明

S = stack(U,vars) 将来自输入表或时间表的多个变量的数据堆叠到输出表或时间表的一个变量中。输入参量 vars 指定要堆叠的变量。该函数将输入的变量中的值交错堆叠到输出。它还会向输出添加一个指示变量。在输出的每一行中,指示变量的值指示输入的哪个变量提供了这些数据。

如果输入有 N 行,并且 vars 指定了 M 个变量,则输出有 M*N 行。通常,输出包含的变量比输入的变量少,但包含的行数更多。

输出的指示变量的数据类型为 categorical。对堆叠数据调用 groupsummaryvarfun 等函数时,您可以使用该指示变量作为分组变量。

如果 vars 未在输入表或时间表中指定所有变量,则其余变量的值不会与 vars 指定的变量的值堆叠。stack 会将未堆叠的变量复制到它们在输出中对应的各自的变量中。

  • 如果输入是包含行名称的表,则不能在输出中堆叠表自身的行名称。

  • 如果输入是时间表,则不能在输出中堆叠时间表自身的行名称。

示例

S = stack(U,{vars1,...,varsN}) 将由 {vars1,...,varsN} 指定的变量的多个列表中的值堆叠到输出中的 N 个堆叠变量中。

示例

S = stack(___,Name=Value) 用于在上述语法中的输入参量之外另使用一个或多个名称-值参量指定选项。例如,您可以为输出中的新堆叠变量指定您自己的名称。

示例

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

示例

示例

全部折叠

创建一个包含来自三个不同气象站温度测量值的表。该表采用分列格式,因为每个表变量都对应其中一个气象站。

ST1 = [93;57;87;89];
ST2 = [89;77;92;86];
ST3 = [95;62;89;91];

U = table(ST1,ST2,ST3)
U=4×3 table
    ST1    ST2    ST3
    ___    ___    ___

    93     89     95 
    57     77     62 
    87     92     89 
    89     86     91 

要将测量值堆叠到输出表中的一个变量,请使用 stack 函数。在每一行中,指示变量 ST1_ST2_ST3_Indicator 指示对应的测量值来自那个气象站。

S = stack(U,1:3)
S=12×2 table
    ST1_ST2_ST3_Indicator    ST1_ST2_ST3
    _____________________    ___________

             ST1                 93     
             ST2                 89     
             ST3                 95     
             ST1                 57     
             ST2                 77     
             ST3                 62     
             ST1                 87     
             ST2                 92     
             ST3                 89     
             ST1                 89     
             ST2                 86     
             ST3                 91     

堆叠格式的一个用途是,你可以使用指示变量对行进行分组,并对这些分组执行计算。例如,要计算每个气象站的平均温度和温度标准差,可以使用 groupsummary 函数。使用 groupsummary,您可以在一次函数调用中计算多项统计数据并在一个表中返回结果。

weatherStats = groupsummary(S,"ST1_ST2_ST3_Indicator",["mean" "std"])
weatherStats=3×4 table
    ST1_ST2_ST3_Indicator    GroupCount    mean_ST1_ST2_ST3    std_ST1_ST2_ST3
    _____________________    __________    ________________    _______________

             ST1                 4               81.5              16.523     
             ST2                 4                 86              6.4807     
             ST3                 4              84.25              15.042     

从样本文件中加载一个表,其中列出五次不同暴风雪天气给三个城镇带来的降雪量。由于该表记录了本季节固定的一组风暴编号,因此 Storm 变量在一个分类数组中包含了风暴编号。

load snowfallByTown.mat
U
U=5×5 table
       Date        Storm    Natick    Boston    Worcester
    ___________    _____    ______    ______    _________

    25-Dec-2024      1        20        18         26    
    02-Jan-2025      2         5         9         10    
    23-Jan-2025      3        13        21         16    
    07-Feb-2025      4         0         5          3    
    15-Feb-2025      5        17        12         15    

要堆叠有关降雪量的数据,请使用 stack 函数。将变量 NatickBostonWorcester 中的值堆叠到单个变量中。将包含堆叠数据值的变量命名为 Snowfall。将新指示变量命名为 Town

输出表包含每场暴风雪的三行数据。stack 函数将 DateStorm 变量视为常变量,因为没有将它们指定为数据或指示变量。stack 不会堆叠来自 DateStorm 的值,而是将它们复制到输出表中需要的行中。例如,Storm 的值在输出的前三行为 1,因为这些行都有关于同一场暴风雪的数据。同样,前三行也有相同的日期。

S = stack(U,["Natick" "Boston" "Worcester"], ...
          NewDataVariableName="Snowfall", ...
          IndexVariableName="Town")
S=15×4 table
       Date        Storm      Town       Snowfall
    ___________    _____    _________    ________

    25-Dec-2024      1      Natick          20   
    25-Dec-2024      1      Boston          18   
    25-Dec-2024      1      Worcester       26   
    02-Jan-2025      2      Natick           5   
    02-Jan-2025      2      Boston           9   
    02-Jan-2025      2      Worcester       10   
    23-Jan-2025      3      Natick          13   
    23-Jan-2025      3      Boston          21   
    23-Jan-2025      3      Worcester       16   
    07-Feb-2025      4      Natick           0   
    07-Feb-2025      4      Boston           5   
    07-Feb-2025      4      Worcester        3   
    15-Feb-2025      5      Natick          17   
    15-Feb-2025      5      Boston          12   
    15-Feb-2025      5      Worcester       15   

要仅将 Storm 包含为常变量,请指定 ConstantVariables 名称-值参量。

S = stack(U,["Natick" "Boston" "Worcester"], ...
          NewDataVariableName="Snowfall", ...
          IndexVariableName="Town", ...
          ConstantVariables="Storm")
S=15×3 table
    Storm      Town       Snowfall
    _____    _________    ________

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

从样本文件中加载表格,该表格列出了经历电力中断的电力公司客户的数量。样本数据按月和美国的地区进行汇总。将该表转换为时间表。月份成为时间表的行时间。

load customersByRegion.mat
customersByRegion = table2timetable(customersByRegion)
customersByRegion=6×3 timetable
        Month        NorthEast    MidWest    SouthEast
    _____________    _________    _______    _________

    October-2023        3492         565       1027   
    November-2023       2944        1293        834   
    December-2023       2559         936       1412   
    January-2024       12045       50117          0   
    February-2024       4931        1089        137   
    March-2024          3018         942        870   

将变量 NorthEastMidWestSouthEast 堆叠到一个名为 CustomersOutage 的变量中。将新指示变量命名为 Region。还返回一个名为 indexCustomersOutage 的索引向量作为第二个输出。它指示未堆叠输入和堆叠输出中的行之间的对应关系。(出于堆叠目的,stackMonth(包含行时间)视为一个常变量。该函数会复制输出时间表中的行时间。)

[customersOutage,indexCustomersOutage] = stack(customersByRegion,1:3, ...
                                               NewDataVariableName="CustomersOutage", ...
                                               IndexVariableName="Region")
customersOutage=18×2 timetable
        Month         Region      CustomersOutage
    _____________    _________    _______________

    October-2023     NorthEast          3492     
    October-2023     MidWest             565     
    October-2023     SouthEast          1027     
    November-2023    NorthEast          2944     
    November-2023    MidWest            1293     
    November-2023    SouthEast           834     
    December-2023    NorthEast          2559     
    December-2023    MidWest             936     
    December-2023    SouthEast          1412     
    January-2024     NorthEast         12045     
    January-2024     MidWest           50117     
    January-2024     SouthEast             0     
    February-2024    NorthEast          4931     
    February-2024    MidWest            1089     
    February-2024    SouthEast           137     
    March-2024       NorthEast          3018     
      ⋮

indexCustomersOutage = 18×1

     1
     1
     1
     2
     2
     2
     3
     3
     3
     4
     4
     4
     5
     5
     5
      ⋮

您可以使用索引向量获取堆叠输出中包含来自未堆叠输入特定行的数据的所有行。例如,对 customersOutage 进行索引,以获取包含 customersByRegion 的第一行的数据的所有输出行。

idx = (indexCustomersOutage == 1);
dataFromFirstRowCustomersByRegion = customersOutage(idx,:)
dataFromFirstRowCustomersByRegion=3×2 timetable
       Month         Region      CustomersOutage
    ____________    _________    _______________

    October-2023    NorthEast         3492      
    October-2023    MidWest            565      
    October-2023    SouthEast         1027      

可以将输入表或时间表中的值堆叠到输出表或时间表的多个变量中。要在输出中创建多个堆叠变量,请使用元胞数组指定来自输入的多组变量。

例如,创建一个包含四个变量的表,其中的变量包含两组温度测量值。

D1 = [93;57;87;89];
D2 = [89;77;92;86];
T1 = [95;62;89;91];
T2 = [88;69;91;83];

U = table(D1,D2,T1,T2)
U=4×4 table
    D1    D2    T1    T2
    __    __    __    __

    93    89    95    88
    57    77    62    69
    87    92    89    91
    89    86    91    83

假设 D1D2 使用不同的仪器对同一个位置进行采样,同样,T1T2 对第二个位置进行采样。要将同一位置的测量值放在一起,请使用 stack 和一个指定两组输入表变量的元胞数组。stack 函数将 D1D2 中的值交错堆叠到输出表变量 D1_D2,将 T1T2 中的值交错堆叠到 T1_T2。指示变量通过指示每个分组中哪个输入表变量向输出表提供了数值来展示这种交错堆叠。如果指定多组变量,则各组的变量数必须相同。

S = stack(U,{["D1" "D2"],["T1" "T2"]})
S=8×3 table
    Indicator    D1_D2    T1_T2
    _________    _____    _____

        1         93       95  
        2         89       88  
        1         57       62  
        2         77       69  
        1         87       89  
        2         92       91  
        1         89       91  
        2         86       83  

要指定新的变量名称,请使用 NewDataVariableName 名称-值参量。新名称的数量必须等于您在元胞数组中指定的分组数量。

S = stack(U,{["D1" "D2"],["T1" "T2"]}, ...
          NewDataVariableName=["Location 1" "Location 2"])
S=8×3 table
    Indicator    Location 1    Location 2
    _________    __________    __________

        1            93            95    
        2            89            88    
        1            57            62    
        2            77            69    
        1            87            89    
        2            92            91    
        1            89            91    
        2            86            83    

输入参数

全部折叠

输入表,指定为表或时间表。

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

示例: S = stack(U,["Var1" "Var3" "Var5"]) 堆叠 U 的名为 Var1Var3Var5 的变量。

示例: S = stack(U,1:4)U 的前四个变量堆叠到 S 中的一个变量中。

名称-值参数

全部折叠

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

示例: NewDataVariableName="StackedData" 命名新数据变量 StackedData

要在输出中复制的 vars 以外的变量,指定为字符串数组、字符向量、字符向量元胞数组、pattern 标量、正整数、正整数数组或逻辑向量。

默认情况下,stack 函数会堆叠由 vars 指定的变量,然后将其余变量的值复制到输出中相应的行上。如果您指定了 ConstantVariables,则 stack 函数会堆叠由 vars 指定的变量,复制 ConstantVariables 指定的变量的值,然后排除其余变量。

输入可以在其第一个维度包含行标签。如果输入是一个表,则它可以将行名称作为标签。如果输入是一个时间表,则它必须将行时间作为标签。

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

  • stack 会复制行名称或行时间,即使您没有在 ConstantVariables 中包含它们也是如此。

输出中新数据变量的名称,指定为字符串数组、字符向量或字符向量元胞数组。默认值是 U 中堆叠的变量名称的串联。

输出中新指示变量的名称,指定为字符串标量或字符向量。默认值是基于 NewDataVariableName 的名称。

输出参量

全部折叠

堆叠表,以表或时间表形式返回。输出包含一个堆叠的数据变量、一个分类指示变量以及任何常变量。

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

stackvars 中列出的第一个变量中的变量单位和变量描述属性值赋给新数据变量的对应 S.Properties.VariableUnitsS.Properties.VariableDescriptions 值。

输入的行索引,以行向量形式返回。索引向量 iu 标识输入中包含复制到输出的对应数据的行。例如,如果 iu(5) 的值是 2,则输出的第五行中的数据来自输入的第二行。

扩展功能

全部展开

版本历史记录

在 R2013b 中推出

另请参阅

函数

实时编辑器任务