unstack
将单个变量中的数据分叠到多个变量中
说明
将表或时间表 U
= unstack(S
,vars
,ivar
)S
转换为分叠的等同表或时间表 U
。vars
指定 S
中的变量,其中每个变量都分叠为 U
中的多个变量。一般来说,U
比 S
包含的变量更多,但行更少。
ivar
输入参数指定 S
中被 unstack
用作指示变量的变量。ivar
中的值确定分叠后 U
中有哪些变量包含 vars
中的元素。
unstack
函数对其他变量的处理方式会因表和时间表而不同。
如果
S
是表,则unstack
将其余的变量视为分组变量。分组变量中各个唯一的值组合标识了S
中将要分叠到U
某一行的一组行。如果
S
是时间表,则unstack
将丢弃其余的变量。但是,unstack
会将行时间向量视为分组变量。
您不能对表的行名称或时间表的行时间进行分叠,也不能将行名称或行时间指定为指示变量。您可以使用 'ConstantVariables'
参数将行名称或行时间指定为常变量。
使用一个或多个 U
= unstack(S
,vars
,ivar
,Name,Value
)Name,Value
对组参数指定的其他选项转换表或时间表 S
。
例如,您可以指定 unstack
如何将 S
中的变量转换为 U
中的变量。
示例
将一个变量分成三个变量
创建一个表,指示各大城镇各种暴风雪天气带来的降雪量。使用一个 categorical
数组指定城镇,因为此表中有一组固定的城镇名称。
Storm = [3;3;1;3;1;1;4;2;4;2;4;2]; Town = categorical({'Natick';'Worcester';'Natick';'Boston';'Boston';'Worcester';... 'Boston';'Natick';'Worcester';'Worcester';'Natick';'Boston'}); Snowfall = [0;3;5;5;9;10;12;13;15;16;17;21]; S = table(Storm,Town,Snowfall)
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
S
针对每种暴风雪天气包含三个降雪量项,每个城镇一个。S
为堆叠格式,Town
具有 categorical
数据类型。具有 categorical
数据类型的表变量是有用的指示变量和用于分叠的分组变量。
将变量 Snowfall
分成三个变量,每个对应变量 Town
中指定的一个城镇。输出表 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
U
中的各行包含 S
中的行(这些行在分组变量 Storm
中具有相同的值)的数据。Storm
中唯一值的顺序决定了 U
中数据的顺序。
向各组应用聚合函数
对数据进行分叠运算,并向同一个组中具有相同指示变量值的多行应用聚合函数。
创建一个时间表,其中包含两支股票两天内的价格数据。要指定行时间,请使用 datetime
值。使用 categorical
数组指定股票名称,因为此时间表有一组固定的股票名称。
Date = [repmat(datetime('2008-04-12'),6,1);... repmat(datetime('2008-04-13'),5,1)]; Stock = categorical({'Stock1';'Stock2';'Stock1';'Stock2';... 'Stock2';'Stock2';'Stock1';'Stock2';... 'Stock2';'Stock1';'Stock2'}); Price = [60.35;27.68;64.19;25.47;28.11;27.98;... 63.85;27.55;26.43;65.73;25.94]; S = timetable(Date,Stock,Price)
S=11×2 timetable
Date Stock Price
___________ ______ _____
12-Apr-2008 Stock1 60.35
12-Apr-2008 Stock2 27.68
12-Apr-2008 Stock1 64.19
12-Apr-2008 Stock2 25.47
12-Apr-2008 Stock2 28.11
12-Apr-2008 Stock2 27.98
13-Apr-2008 Stock1 63.85
13-Apr-2008 Stock2 27.55
13-Apr-2008 Stock2 26.43
13-Apr-2008 Stock1 65.73
13-Apr-2008 Stock2 25.94
S
包含 Stock1
第一天的两个价格和 Stock2
第一天的四个价格。
创建一个时间表,包含代表每支股票的不同变量,每一天占一行。将 Date
(行时间向量)用作分组变量,并向每个组的变量 Price
的数值应用聚合函数 @mean
。
[U,is] = unstack(S,'Price','Stock',... 'AggregationFunction',@mean)
U=2×2 timetable
Date Stock1 Stock2
___________ ______ ______
12-Apr-2008 62.27 27.31
13-Apr-2008 64.79 26.64
is = 2×1
1
7
U
包含按日期分组的每支股票的平均价格。
is
标识 S
中每个行组的第一个值的索引。日期为 2008 年 4 月 13 日的组的第一个值位于 S
的第七行。
输入参数
S
— 输入表
表 | 时间表
输入表,指定为表或时间表。S
必须包含要分叠的数据变量 vars
和指示变量 ivar
。S
中的其余变量可以视为分组变量或常变量。
vars
— S
中要分叠的变量
正整数 | 正整数向量 | 字符串数组 | 字符向量 | 字符向量元胞数组 | pattern
标量 | 逻辑向量
S
中要分叠的变量,指定为正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern
标量或逻辑向量。
ivar
— S
中的指示变量
正整数 | 字符向量 | 字符串标量
S
中的指示变量,指定为正整数、字符向量或字符串标量。由 ivar
指定的变量中的值指示 U
中的哪些变量包含由 vars
指定的变量中的元素。
由 ivar
指定的变量可以是数值向量、逻辑向量、字符数组、字符向量元胞数组、字符串数组或分类向量。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: 'AggregationFunction',@mean
对 vars
中的值应用聚合函数 @mean
。
GroupingVariables
— S
中定义行组的分组变量
正整数 | 正整数向量 | 字符串数组 | 字符向量 | 字符向量元胞数组 | pattern
标量 | 逻辑向量
S
中定义行组的分组变量,指定为逗号分隔的对组,包含 'GroupingVariables'
和一个正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern
标量或逻辑向量。S
中的每个行组都将变成 U
中的一行。
S
可以在其第一个维度包含行标签。如果 S
是表,则它可以将行名称作为标签。如果 S
是时间表,则它必须将行时间作为标签。unstack
可以将行标签视为分组变量。
如果您不指定
'GroupingVariables'
,并且S
是时间表,则unstack
会将行时间视为分组变量。如果您指定了
'GroupingVariables'
,而S
又具有行名称或行时间,则unstack
不会将行名称或行时间视为分组变量,除非您将它们包含在'GroupingVariables'
的值中。
ConstantVariables
— 组中的常变量
正整数 | 正整数向量 | 字符串数组 | 字符向量 | 字符向量元胞数组 | pattern
标量 | 逻辑向量
组内的常变量,指定为逗号分隔的对组,包含 'ConstantVariables'
和一个正整数、正整数向量、字符串数组、字符向量、字符向量元胞数组、pattern
标量或逻辑向量。
U
中这些变量的值提取自 S
中各组的第一行。
当您指定 'ConstantVariables'
的值时,可以包括 S
的行名称或行时间。
NewDataVariableNames
— U
中新数据变量的名称
字符向量元胞数组 | 字符串数组
U
中新数据变量的名称,以逗号分隔的对组形式指定,该对组由 'NewDataVariableNames'
和一个字符向量元胞数组或字符串数组组成。
如果您不指定 'NewDataVariableNames'
,则 unstack
将根据 ivar
指定的指示变量的值为 U
中的新数据变量创建名称。
AggregationFunction
— 将 vars
中的多个值加总为单个值的聚合函数
@sum
(数值数据)或 @unique
(非数值数据) (默认) | 函数句柄
将 vars
中的多个值加总为单个值的聚合函数,以逗号分隔的对组形式指定,该对组由 'AggregationFunction'
和一个函数句柄组成。unstack
将此函数应用于同一个组中具有相同 ivar
值的行。此函数必须将数据值加总成单个值。
如果您没有指定 'AggregationFunction'
的值,则 unstack
会根据数据类型使用不同默认聚合函数。
对于数值数据,默认聚合函数为
sum
。对于非数值数据,默认聚合函数为
unique
。
如果没有要聚合的数据值,则在分叠后将没有与 ivar
的给定指示符值相对应的数据值,unstack
必须在分叠后的输出表中填充空元素。在这种情况下,unstack
使用空数组作为输入调用聚合函数。unstack
填充的值取决于聚合函数在输入为空数组时返回的值。
没有要聚合的数据时聚合函数返回的值 | 插入分叠的表的空元素中的值 |
---|---|
聚合函数引发错误 |
|
空数组 | 填充适当数据类型的值( 示例:如果聚合函数是 |
标量值 | 从聚合函数返回的标量值。 示例:如果聚合函数是 |
向量、矩阵或多维数组 |
|
VariableNamingRule
— U
中变量的命名规则
'modify'
(默认) | 'preserve'
U
中变量的命名规则,指定为逗号分隔的对组,其中包含 'VariableNamingRule'
和值 'modify'
或 'preserve'
。
'VariableNamingRule'
的值指定以下在输出表或时间表中命名变量的规则。
| 规则 |
---|---|
| 修改取自输入表或时间表的名称,使输出中对应的变量名称也是有效的 MATLAB® 标识符。 |
| 保留取自输入表或时间表的原始名称。输出中对应的变量名称可以包含任何 Unicode® 字符,包括空格和非 ASCII 字符。 注意:在某些情况下,
|
输出参数
详细信息
分组变量
分组变量是用于对数据进行分组或分类的实用变量。分组变量对于按组对数据进行汇总或可视化十分有用。您可以通过指定一个或多个分组变量来定义表中的组。
分组变量可以是以下任意一种类型:
分类向量
字符向量元胞数组
字符串数组
字符数组
数值向量,通常包含正整数
逻辑向量
具有相同分组变量值的行属于同一个组。如果使用多个分组变量,则具有相同分组变量值组合的行属于同一个组。
提示
您可以指定
S
中的多个数据变量,每个变量都会变成U
中的一组分叠数据变量。可使用正整数向量、包含多个变量名称的元胞数组或字符串数组或者逻辑向量来指定vars
。输入参数ivar
指定的一个指示变量适用于vars
指定的所有数据变量。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
必须指定
'NewDataVariableNames'
名称-值参数。其值必须为常量。vars
和ivars
输入参数(数据变量和指示变量)必须为常量。如果指定分组变量和常变量,则它们必须为常量。
如果指定聚合函数,则它必须为常量。
如果输入是具有规则行时间的时间表,并且您指定不包括行时间的分组变量,则输出时间表可能具有不规则行时间。尽管输出行时间之间的间隔可能看起来相同,但输出时间表认为行时间向量是不规则的。
如果输入表或时间表的一个变量是字符向量元胞数组,则
unstack
会在生成的代码中用 1×0 字符数组填充对应输出变量中的空单元格。在 MATLAB 中,unstack
用 0×0 字符数组来填充这些空缺。当输入表或时间表中有一个变量是异构元胞数组且无法转换为同构元胞数组时,
unstack
函数不支持生成代码。如果输入有一个变量是同构元胞数组或可以转换为同构元胞数组,则必须指定
'AggregationFunction'
名称-值参数。'AggregationFunction'
的默认值是'unique'
。但是,unique
函数不支持元胞数组。
vars
输入参数以及'GroupingVariables'
和'ConstantVariables'
名称-值参数的值不支持模式表达式。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
版本历史记录
在 R2013b 中推出R2020a: 非数值数据的默认聚合函数
在 R2020a 中,如果您没有指定 'AggregationFunction'
名称-值对组参数,则非数值数据的默认聚合函数是 unique
函数。在以前的版本中,没有针对非数值数据的默认聚合函数,因此 unstack
会引发错误。
R2020a: 当聚合函数没有要聚合的数据时,行为会发生变化
在 R2020a 中,当聚合函数没有要聚合的数据时,行为会发生变化。当分叠后没有与指示变量中的值对应的数据值时,就会出现这种情况。在这种情况下,unstack
实质上是对空数组调用聚合函数。
没有要聚合的数据时聚合函数返回的值 | R2020a 中的行为 | 以前版本中的行为 |
---|---|---|
数据变量是数值,聚合函数会引发错误。 |
|
|
数据变量是非数值,聚合函数会返回空数组。 |
|
|
数据变量是数值,聚合函数返回标量值(例如, |
|
|
数据变量是数值,聚合函数返回向量、矩阵或多维数组。 |
|
|
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
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)