Main Content

stack

(Not Recommended) Stack dataset array from multiple variables into single variable

The dataset data type is not recommended. To work with heterogeneous data, use the MATLAB® table data type instead. See MATLAB table documentation for more information.

Syntax

B = stack(A,datavars)
[B,iA] = stack(A,datavars)
B = stack(A,datavars,Parameter,value)

Description

B = stack(A,datavars) stacks multiple variables in dataset array A into a single variable in B. In general, B contains fewer variables but more observations than A.

datavars specifies a group of m data variables in A. stack creates a single data variable in B by interleaving their values, and if A has n observations, then B has m-by-n observations. In other words, stack takes the m data values from each observation in A and stacks them up to create m observations in B. datavars is a positive integer, a vector of positive integers, a character vector, a string array, a cell array of character vectors, or a logical vector. stack also creates a grouping variable in B to indicate which of the m data variables in A each observation in B corresponds to.

stack assigns values for the "per-variable properties (e.g., Units and VarDescription) for the new data variable in B from the corresponding property values for the first variable listed in datavars.

stack copies the remaining variables from A to B without stacking, by replicating each of their values m times. These variables are typically grouping variables. Because their values are constant across each group of m observations in B, they identify which observation in A an observation in B came from.

[B,iA] = stack(A,datavars) returns an index vector iA indicating the correspondence between observations in B and those in A. stack creates B(j,:) using A(iA(j),datavarss).

For more information on grouping variables, see Grouping Variables.

Input Arguments

B = stack(A,datavars,Parameter,value) uses the following parameter name/value pairs to control how stack converts variables in A to variables in B:

'ConstVars'Variables in A to copy to B without stacking. ConstVars is a positive integer, a vector of positive integers, a character vector, a string array, a cell array of character vectors, or a logical vector. The default is all variables in A not specified in datavars.
'NewDataVarName'A name for the data variable to be created in B. The default is a concatenation of the names of the m variables that are stacked up.
'IndVarName'A name for the grouping variable to create in B to indicate the source of each value in the new data variable. The default is based on the 'NewDataVarName' parameter.

You can also specify multiple groups of data variables in A, each of which becomes a variable in B. All groups must contain the same number of variables. Use a string array or cell array of character vectors to contain multiple parameter values for datavars or to contain multiple values for 'NewDataVarName'.

Examples

Combine several variables for estimated influenza rates into a single variable. Then unstack the estimated influenza rates by date.

load flu
 
% FLU has a 'Date' variable, and 10 variables for estimated influenza rates
% (in 9 different regions, estimated from Google searches, plus a
% nationwide estimate from the CDC). Combine those 10 variables into an
% array that has a single data variable, 'FluRate', and an indicator
% variable, 'Region', that says which region each estimate is from.
[flu2,iflu] = stack(flu, 2:11, 'NewDataVarName','FluRate', ...
    'IndVarName','Region')
 
% The second observation in FLU is for 10/16/2005.  Find the observations
% in FLU2 that correspond to that date.
flu(2,:)
flu2(iflu==2,:)
 
% Use the 'Date' variable from that array to split 'FluRate' into 52
% separate variables, each containing the estimated influenza rates for
% each unique date.  The new array has one observation for each region.  In
% effect, this is the original array FLU "on its side".
dateNames = cellstr(datestr(flu.Date,'mmm_DD_YYYY'));
[flu3,iflu2] = unstack(flu2, 'FluRate', 'Date', ...
    'NewDataVarNames',dateNames)
 
% Since observations in FLU3 represent regions, IFLU2 indicates the first
% occurrence in FLU2 of each region.
flu2(iflu2,:)