Main Content

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

stack

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

说明

S = stack(U,vars) 将输入表或时间表 U 转换为堆叠的表或时间表 S。该函数将 U 中多个变量的值堆叠到 S 的一个变量中。输入参量 vars 通过变量的名称或变量在 U 中的位置,指定要堆叠 U 中的哪些变量。

如果 Un 个行,并且 varsU 中指定 m 个变量,则 Sm*n 个行。stack 函数对 U 中指定变量的值进行交错,以在 S 中创建一个变量。例如,如果 U 有 10 行,并且您堆叠来自 U 的三个变量,则 S 有 30 行。通常,S 包含的变量数比 U 少,但包含的行数比其多。

输出表或时间表 S 包含一个新的 categorical 变量,以指示 S 的每一行中的堆叠数据来自 U 中的哪个变量。stack 函数从 U 中未堆叠的变量复制数据。

  • 如果 U 是表,则不能堆叠行名称。

  • 如果 U 是时间表,则不能堆叠行时间。

示例

S = stack(U,{vars1,...,varsN}) 将由 {vars1,...,varsN} 指定的变量中的值堆叠到 S 中的 N 个变量中。有关详细信息,请参阅在输出中创建多个堆叠变量

S = stack(___,Name,Value) 转换表 U,并通过一个或多个名称值参量指定其他选项。

例如,您可以为 S 中的新堆叠变量指定变量名称。

示例

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

示例

示例

全部折叠

从三个单独的测试创建一个包含测试分数的表。此表为分叠格式。

Test1 = [93;57;87;89];
Test2 = [89;77;92;86];
Test3 = [95;62;89;91];

U = table(Test1,Test2,Test3)
U=4×3 table
    Test1    Test2    Test3
    _____    _____    _____

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

该表包含四行和三个变量。

将测试分数堆叠到一个变量中。

S = stack(U,1:3)
S=12×2 table
    Test1_Test2_Test3_Indicator    Test1_Test2_Test3
    ___________________________    _________________

               Test1                      93        
               Test2                      89        
               Test3                      95        
               Test1                      57        
               Test2                      77        
               Test3                      62        
               Test1                      87        
               Test2                      92        
               Test3                      89        
               Test1                      89        
               Test2                      86        
               Test3                      91        

S 包含十二行和两个变量。S 为堆叠格式。

分类变量 Test1_Test2_Test3_Indicator 标识哪个测试对应于堆叠数据变量 Test1_Test2_Test3 中的分数。

创建一个时间表,指示三个城镇的五个不同暴风雪天气带来的降雪量。将暴风雪日期指定为 datetime 值,并将其用作时间表 U 的行时间。将由暴风雪编号组成的数组 Storm 指定为分类数组,因为在此时间表中有一组固定的暴风雪编号。

Storm = categorical([1;2;3;4;5]);
Date = datetime({'2011-12-25';'2012-01-02';'2012-01-23';'2012-02-07';'2012-02-15'});
Natick = [20;5;13;0;17];
Boston = [18;9;21;5;12];
Worcester = [26;10;16;3;15];

U = timetable(Date,Storm,Natick,Boston,Worcester)
U=5×4 timetable
       Date        Storm    Natick    Boston    Worcester
    ___________    _____    ______    ______    _________

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

变量 StormDate 包含每个位置的常量数据。

将变量 NatickBostonWorcester 堆叠到一个变量中。命名包含堆叠数据的变量 Snowfall,并命名新指示变量 Town

S = stack(U,{'Natick','Boston','Worcester'},...
          'NewDataVariableName','Snowfall',...
          'IndexVariableName','Town')
S=15×3 timetable
       Date        Storm      Town       Snowfall
    ___________    _____    _________    ________

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

S 包含每场暴风雪的三行数据,stack 相应地复制常变量 StormDate 中的数据。

分类变量 Town 标识 U 中的哪个变量包含对应的 Snowfall 数据。

创建一个时间表,其中包含沿美国东海岸的每月流感发病率估计值。为东北、中大西洋和南大西洋创建另一个变量。数据源:Google Flu Trends 项目(现已停止)。使用一个 datetime 数组作为时间表的行时间。

Month = datetime(2005,10,1,'Format','MMMM yyyy') + calmonths(0:5);
Month = Month';
NE = [1.1902; 1.3610; 1.5003; 1.7772; 2.1350; 2.2345];
MidAtl = [1.1865; 1.4120; 1.6043; 1.8830; 2.1227; 1.9920];
SAtl = [1.2730; 1.5820; 1.8625; 1.9540; 2.4803; 2.0203];

fluU = timetable(Month,NE,MidAtl,SAtl)
fluU=6×3 timetable
        Month          NE      MidAtl     SAtl 
    _____________    ______    ______    ______

    October 2005     1.1902    1.1865     1.273
    November 2005     1.361     1.412     1.582
    December 2005    1.5003    1.6043    1.8625
    January 2006     1.7772     1.883     1.954
    February 2006     2.135    2.1227    2.4803
    March 2006       2.2345     1.992    2.0203

变量 Month 包含跨行的常量数据。

将变量 NEMidAtlSAtl 堆叠到一个名为 FluRate 的变量中。命名新指示变量 Region 并输出索引向量 ifluU,以指示分叠输入表 fluU 和堆叠输出表 fluS 中的各行之间的对应关系。

[fluS,ifluU] = stack(fluU,1:3,...
                     'NewDataVariableName','FluRate',...
                     'IndexVariableName','Region')
fluS=18×2 timetable
        Month        Region    FluRate
    _____________    ______    _______

    October 2005     NE        1.1902 
    October 2005     MidAtl    1.1865 
    October 2005     SAtl       1.273 
    November 2005    NE         1.361 
    November 2005    MidAtl     1.412 
    November 2005    SAtl       1.582 
    December 2005    NE        1.5003 
    December 2005    MidAtl    1.6043 
    December 2005    SAtl      1.8625 
    January 2006     NE        1.7772 
    January 2006     MidAtl     1.883 
    January 2006     SAtl       1.954 
    February 2006    NE         2.135 
    February 2006    MidAtl    2.1227 
    February 2006    SAtl      2.4803 
    March 2006       NE        2.2345 
      ⋮

ifluU = 18×1

     1
     1
     1
     2
     2
     2
     3
     3
     3
     4
      ⋮

ifluU(5)2。输出表 fluS 的第五行包含输入表 fluU 的第二行中的数据。

输入参数

全部折叠

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

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

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

示例: S = stack(U,{'Var1',Var3','Var5'}) 堆叠 U 的名为 Var1Var3Var5 的变量。

名称-值参数

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

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

示例: 'NewDataVariableName','StackedData' 命名新数据变量 StackedData

要包括在输出中的 vars 之外的变量,指定为逗号分隔的对组,包含 'ConstantVariables' 和正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern 标量或逻辑向量。stack 为行中的每个堆叠条目复制常变量中的数据。

默认值是 U 中未由 vars 指定的所有变量。您可以指定 'ConstantVariables' 名称-值对组参量,以便从输出表 S 中排除 vars'ConstantVariables' 未指定的变量。

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

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

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

S 中新数据变量的名称,以逗号分隔的对组形式指定,该对组由 'NewDataVariableName' 和一个字符向量、字符串数组或字符向量元胞数组组成。默认值是 U 中堆叠的变量名称的串联。

S 中新指示变量的名称,指定为逗号分隔的对组,其中包含 'IndexVariableName' 和一个字符向量或字符串标量。默认值是基于 NewDataVariableName 的名称。

输出参量

全部折叠

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

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

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

U 的索引,以列向量形式返回。索引向量 iu 标识输入表 U 中包含对应数据的行。stack 使用 U(iu(j),vars) 在输出表 S 中创建第 j 行。

算法

全部折叠

在输出中创建多个堆叠变量

  • 可以将输入中的值堆叠到输出中的多个变量中。要在 S 中创建多个堆叠变量,请使用元胞数组从 U 中指定多组变量。可以使用元胞数组包含 vars 的多个值,使用字符向量元胞数组或字符串数组包含 'NewDataVariableName' 名称-值对组参量的多个值。所有组都必须包含相同数量的变量。

    例如,如果 U 包含四个变量,则可以使用以下语法在 S 中创建两个堆叠变量,而不是只创建一个。

    vars = {[1 2],[3 4]};
    S = stack(U,vars)
    

    因此,S 的一个堆叠变量的值来自 U 的第一个和第二个变量,另一个堆叠变量的值来自 U 的第三个和第四个变量。

    要在 S 中指定新变量名称,请使用 'NewDataVariableName'。您指定的名称的数量必须等于 vars 中指定的组的数量。

    vars = {[1 2],[3 4]};
    S = stack(U,vars,'NewDataVariableName',{'Vars1And2','Vars3And4'})
    

  • 当您将 vars 指定为字符向量元胞数组时,S 将包含一个堆叠变量。要在使用变量名称的同时指定多个堆叠变量,请使用由字符向量元胞数组组成的元胞数组,或由字符串数组速成的元胞数组。

    例如,当 U 是包含名为 Var1Var2Var3Var4 的变量的表时,以下语法会在 S 中创建一个堆叠变量。

    S = stack(U,{'Var1','Var2','Var3','Var4'})
    

    以下语法在 S 中创建两个堆叠变量。

    S = stack(U,{{'Var1','Var2'} {'Var3','Var4'}})
    

扩展功能

版本历史记录

在 R2013b 中推出

另请参阅

函数

实时编辑器任务