stack
Stack data from input table or timetable into one variable in output table or timetable
Description
converts the input table or timetable, S
= stack(U
,vars
)U
, into the stacked table
or timetable, S
. The function stacks values from multiple
variables in U
into one variable in S
. The
input argument vars
specifies which variables from
U
to stack, either by their names or their positions in
U
.
If U
has n
rows and vars
specifies m
variables in U
, then
S
has m*n
rows. The
stack
function interleaves values from the specified
variables in U
to create one variable in S
.
For example, if U
has 10 rows and you stack three of the
variables from U
, then S
has 30 rows. In
general, S
contains fewer variables, but more rows, than
U
.
The output table or timetable, S
, contains a new
categorical
variable to indicate which variable in
U
the stacked data in each row of S
comes
from. The stack
function replicates data from the variables in
U
that are not stacked.
If
U
is a table, then you cannot stack row names.If
U
is a timetable, then you cannot stack row times.
stacks values from the variables specified by S
= stack(U
,{vars
1,...,vars
N}){vars1,...,varsN}
into N
variables in S
. For more information,
see Create Multiple Stacked
Variables in Output.
converts the table, S
= stack(___,Name,Value
)U
, with additional options specified by one
or more name-value arguments.
For example, you can specify variable names for the new and stacked variables in
S
.
Examples
Stack Three Variables into One
Create a table containing test scores from three separate tests. The table is in unstacked format.
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
The table contains four rows and three variables.
Stack the test scores into a single variable.
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
contains twelve rows and two variables. S
is in stacked format.
The categorical variable, Test1_Test2_Test3_Indicator
, identifies which test corresponds to the score in the stacked data variable, Test1_Test2_Test3
.
Stack Variables and Specify Variable Names
Create a timetable indicating the amount of snowfall in three towns from five different storms. Specify the dates of the storms as datetime
values and use them as the row times of the timetable U
. Specify the array of storm numbers, Storm
, as a categorical array since there is a fixed set of storm numbers in this timetable.
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
The variables Storm
and Date
contain data that is constant at each location.
Stack the variables Natick
, Boston
, and Worcester
into a single variable. Name the variable containing the stacked data, Snowfall
, and name the new indicator variable, 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
contains three rows for each storm, and stack
repeats the data in the constant variables, Storm
and Date
, accordingly.
The categorical variable, Town
, identifies which variable in U
contains the corresponding Snowfall
data.
Stack Variables and Output Index Vector
Create a timetable containing estimated influenza rates per month along the east coast of the United States. Create a different variable for the Northeast, Mid Atlantic, and South Atlantic. Data Source: the Google Flu Trends project (since discontinued). Use a datetime
array as row times of the timetable.
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
The variable Month
contains data that is constant across the row.
Stack the variables NE
, MidAtl
, and SAtl
into a single variable called FluRate
. Name the new indicator variable Region
and output an index vector, ifluU
, to indicate the correspondence between rows in the input unstacked table, fluU
, and the output stacked table, 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)
is 2
. The fifth row in the output table, fluS
, contains data from the second row in the input table fluU
.
Input Arguments
U
— Input table
table | timetable
Input table, specified as a table or a timetable.
vars
— Variables in U
to stack
positive integer | vector of positive integers | string array | character vector | cell array of character vectors | pattern
scalar | logical vector
Variables in U
to stack, specified as a positive
integer, vector of positive integers, string array, character vector, cell
array of character vectors, or pattern
scalar.
Example: S = stack(U,1:4)
stacks the first four
variables of U
into one variable in
S
.
Example: S = stack(U,{'Var1',Var3','Var5'})
stacks the
variables of U
that are named Var1
,
Var3
, and Var5
.
Name-Value Arguments
Specify optional pairs of arguments as
Name1=Value1,...,NameN=ValueN
, where Name
is
the argument name and Value
is the corresponding value.
Name-value arguments must appear after other arguments, but the order of the
pairs does not matter.
Before R2021a, use commas to separate each name and value, and enclose
Name
in quotes.
Example: 'NewDataVariableName','StackedData'
names the new data
variable StackedData
.
ConstantVariables
— Variables other than vars
to include in the output
positive integer | vector of positive integers | string array | character vector | cell array of character vectors | pattern
scalar | logical vector
Variables other than vars
to include in the output,
specified as the comma-separated pair consisting of
'ConstantVariables'
and a positive integer,
vector of positive integers, string array, character vector, cell array
of character vectors, pattern
scalar, or logical vector.
stack
replicates the data from the constant
variables for each stacked entry from a row.
The default is all the variables in U
not
specified by vars
. You can specify the
'ConstantVariables'
name-value pair argument to
exclude variables not specified by vars
or
'ConstantVariables'
from the output table,
S
.
U
can have row labels along its first dimension. If
U
is a table, then it can have row names as the
labels. If U
is a timetable, then it must have row
times as the labels.
You can include the row names or row times when you specify the value of
'ConstantVariables'
.stack
replicates the row names or row times even when you do not include them in'ConstantVariables'
.
NewDataVariableName
— Name for the new data variable in S
character vector | string array | cell array of character vectors
Name for the new data variable in S
, specified as
the comma-separated pair consisting of
'NewDataVariableName'
and a character vector,
string array, or cell array of character vectors. The default is a
concatenation of the names of the variables from U
that are stacked up.
IndexVariableName
— Name for the new indicator variable in S
character vector | string scalar
Name for the new indicator variable in S
, specified
as the comma-separated pair consisting of
'IndexVariableName'
and a character vector or
string scalar. The default is a name based on
NewDataVariableName
.
Output Arguments
S
— Output table
table | timetable
Stacked table, returned as a table or a timetable. S
contains a stacked data variable, a categorical indicator variable, and any
constant variables.
You can store additional metadata such as descriptions, variable units,
variable names, and row names in S
. For more information,
see the Properties sections of table
or timetable
.
stack
assigns the variable units and variable
description property values from the first variable listed in
vars
to the corresponding
S.Properties.VariableUnits
and
S.Properties.VariableDescrisciptions
values for the
new data variable.
iu
— Index to U
column vector
Index to U
, returned as a column vector. The index
vector, iu
, identifies the row in the input table,
U
, containing the corresponding data.
stack
creates the j
th row in the
output table, S
, using
U(iu(j),vars)
.
Algorithms
Create Multiple Stacked Variables in Output
It is possible to stack values from the input into multiple variables in the output. To create multiple stacked variables in
S
, use a cell array to specify multiple groups of variables fromU
. You can use a cell array to contain multiple values forvars
, and a cell array of character vectors or string array to contain multiple values for the'NewDataVariableName'
name-value pair argument. All groups must contain the same number of variables.For example, if
U
contains four variables, then you can create two stacked variables inS
, instead of only one, by using this syntax.vars = {[1 2],[3 4]}; S = stack(U,vars)
As a result,
S
has a stacked variable with values from the first and second variables ofU
, and another stacked variable with values from the third and fourth variables ofU
.To specify new variable names in
S
, use'NewDataVariableName'
. The number of names you specify must equal the number of groups specified invars
.vars = {[1 2],[3 4]}; S = stack(U,vars,'NewDataVariableName',{'Vars1And2','Vars3And4'})
When you specify
vars
as a cell array of character vectors, thenS
contains one stacked variable. To specify multiple stacked variables while using variable names, use a cell array of cell arrays of character vectors, or a cell array of string arrays.For example, this syntax creates one stacked variable in
S
whenU
is a table with variables namedVar1
,Var2
,Var3
, andVar4
.S = stack(U,{'Var1','Var2','Var3','Var4'})
This syntax creates two stacked variables in
S
.S = stack(U,{{'Var1','Var2'} {'Var3','Var4'}})
Extended Capabilities
Tall Arrays
Calculate with arrays that have more rows than fit in memory.
The
stack
function fully supports tall arrays. For more information,
see Tall Arrays.
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
The second input argument,
vars
, must be constant.The values of the
'ConstantVariables'
,'NewDataVariableName'
, and'IndexVariableName'
name-value arguments must be constant.The
vars
input argument and the value of'ConstantVariables'
name-value argument do not support pattern expressions.
Thread-Based Environment
Run code in the background using MATLAB® backgroundPool
or accelerate code with Parallel Computing Toolbox™ ThreadPool
.
This function fully supports thread-based environments. For more information, see Run MATLAB Functions in Thread-Based Environment.
Version History
Introduced in R2013b
See Also
Functions
Live Editor Tasks
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)