Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

grouptransform

按组转换

说明

示例

G = grouptransform(T,groupvars,method)groupvars 中指定的变量对表或时间表中的数据进行分组,并使用 method 指定的计算方法转换各组数据。输出 G 是表或时间表,其中包含已转换的数据,代替了来自 T 的非分组变量。例如,G = grouptransform(T,'Gender','norm') 使用 2-范数按性别对 T 中的数据进行归一化。

示例

G = grouptransform(T,groupvars,groupbins,method) 根据 groupbins 对转换后的数据分 bin,将组作为附加变量放在输出表的末尾。例如,G = grouptransform(T,'SaleDate','year','rescale')T 中的数据缩放到 [0,1] 范围内,并按销售年度分 bin。

G = grouptransform(___,datavars) 为上述语法转换指定表变量。

示例

G = grouptransform(___,Name,Value) 使用一个或多个名称-值对组指定其他分组属性。例如,G = grouptransform(T,'Temp','linearfill','ReplaceValues',false) 将填充的数据追加为 T 的附加变量,而不是替换非分组变量。

A 是向量或矩阵时,B = grouptransform(A,groupvars,method) 根据 groupvars 中的分组向量的各个唯一组合返回转换后的数据。groupvars 可以是列向量、矩阵或列向量元胞数组。

示例

B = grouptransform(A,groupvars,groupbins,method) 根据 groupbins 对转换后的数据分 bin。

B = grouptransform(___,Name,Value) 使用一个或多个名称-值对组为上述数组语法指定其他分组属性。

示例

[B,BG] = grouptransform(A,___) 还将返回分组向量的行。

示例

全部折叠

创建一个时间表,其中包含 3 个团队的进度状态。

timeStamp = days([1 1 1 2 2 2 3 3 3]');
teamNumber = [1 2 3 1 2 3 1 2 3]';
percentComplete = [14.2 28.1 11.5 NaN NaN 19.3 46.1 51.2 30.3]';
T = timetable(timeStamp,teamNumber,percentComplete)
T=9×2 timetable
    timeStamp    teamNumber    percentComplete
    _________    __________    _______________

    1 day            1              14.2      
    1 day            2              28.1      
    1 day            3              11.5      
    2 days           1               NaN      
    2 days           2               NaN      
    2 days           3              19.3      
    3 days           1              46.1      
    3 days           2              51.2      
    3 days           3              30.3      

使用线性插值填充每个组的缺失状态百分比 (NaN)。

G = grouptransform(T,'teamNumber','linearfill','percentComplete')
G=9×2 timetable
    timeStamp    teamNumber    percentComplete
    _________    __________    _______________

    1 day            1               14.2     
    1 day            2               28.1     
    1 day            3               11.5     
    2 days           1              30.15     
    2 days           2              39.65     
    2 days           3               19.3     
    3 days           1               46.1     
    3 days           2               51.2     
    3 days           3               30.3     

要将填充的数据追加到原始表而不是替换 percentComplete 变量,请使用 'ReplaceValues' 参数。

Gappend = grouptransform(T,'teamNumber','linearfill','percentComplete','ReplaceValues',false)
Gappend=9×3 timetable
    timeStamp    teamNumber    percentComplete    linearfill_percentComplete
    _________    __________    _______________    __________________________

    1 day            1              14.2                     14.2           
    1 day            2              28.1                     28.1           
    1 day            3              11.5                     11.5           
    2 days           1               NaN                    30.15           
    2 days           2               NaN                    39.65           
    2 days           3              19.3                     19.3           
    3 days           1              46.1                     46.1           
    3 days           2              51.2                     51.2           
    3 days           3              30.3                     30.3           

创建一个表,其中包含日期和对应的利润。

timeStamps = datetime([2017 3 4; 2017 3 2; 2017 3 15; 2017 3 10;...
                       2017 3 14; 2017 3 31; 2017 3 25;...
                       2017 3 29; 2017 3 21; 2017 3 18]);
profit = [2032 3071 1185 2587 1998 2899 3112 909 2619 3085]';
T = table(timeStamps,profit)
T=10×2 table
    timeStamps     profit
    ___________    ______

    04-Mar-2017     2032 
    02-Mar-2017     3071 
    15-Mar-2017     1185 
    10-Mar-2017     2587 
    14-Mar-2017     1998 
    31-Mar-2017     2899 
    25-Mar-2017     3112 
    29-Mar-2017      909 
    21-Mar-2017     2619 
    18-Mar-2017     3085 

按周中日期分组,并按 2-范数对利润进行归一化。

G = grouptransform(T,'timeStamps','dayname','norm')
G=10×3 table
    timeStamps     profit     dayname_timeStamps
    ___________    _______    __________________

    04-Mar-2017    0.42069        Saturday      
    02-Mar-2017          1        Thursday      
    15-Mar-2017    0.79344        Wednesday     
    10-Mar-2017    0.66582        Friday        
    14-Mar-2017    0.60654        Tuesday       
    31-Mar-2017    0.74612        Friday        
    25-Mar-2017    0.64428        Saturday      
    29-Mar-2017    0.60864        Wednesday     
    21-Mar-2017    0.79506        Tuesday       
    18-Mar-2017    0.63869        Saturday      

创建日期向量和对应利润值的向量。

timeStamps = datetime([2017 3 4; 2017 3 2; 2017 3 15; 2017 3 10; ...
                       2017 3 14; 2017 3 31; 2017 3 25; ...
                       2017 3 29; 2017 3 21; 2017 3 18]);
profit = [2032 3071 1185 2587 1998 2899 3112 909 2619 3085]';

按星期几分组,按 2-范数归一化利润值。显示转换后的数据及其对应的组。

[normDailyProfit,dayOfWeek] = grouptransform(profit,timeStamps,'dayname','norm')
normDailyProfit = 10×1

    0.4207
    1.0000
    0.7934
    0.6658
    0.6065
    0.7461
    0.6443
    0.6086
    0.7951
    0.6387

dayOfWeek = 10x1 categorical
     Saturday 
     Thursday 
     Wednesday 
     Friday 
     Tuesday 
     Friday 
     Saturday 
     Wednesday 
     Tuesday 
     Saturday 

输入参数

全部折叠

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

输入数组,指定为向量或矩阵。

分组变量或向量,指定为以下选项之一:

  • 对于数组输入,groupvars 可以是一个行数与 A 相同的列向量,也可以是一组以矩阵或元胞数组形式排列的列向量。

  • 对于表或时间表输入数据,groupvars 指示使用哪些变量来计算数据中的组。您可以使用下表中的任何选项来指定分组变量。

    选项说明示例
    变量名称

    指定单个表变量名称的字符向量或标量字符串

    'Var1'

    "Var1"

    变量名称的向量

    字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称

    {'Var1' 'Var2'}

    ["Var1" "Var2"]

    变量索引的标量或向量

    表变量索引的标量或向量

    1

    [1 3 5]

    逻辑向量

    逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。

    [true false true]

    函数句柄

    函数句柄,以表变量作为输入并返回逻辑标量

    @isnumeric

    vartype 下标

    vartype 函数生成的表下标

    vartype('numeric')

示例: grouptransform(T,"Var3",method)

计算方法,指定为下列值之一:

方法

说明

'zscore'

对数据进行归一化,使其均值为 0、标准差为 1

'norm'

按 2-范数对数据进行归一化

'meancenter'

对数据进行归一化,使其均值为 0

'rescale'

将范围重新缩放为 [0,1]

'meanfill'

使用组数据的均值填充缺失值

'linearfill'

基于非缺失组数据进行线性插值来填充缺失值

您还可以指定函数句柄,该句柄返回其第一个维度的长度为 1 或行数与输入数据相同的一个实体。如果函数返回其第一个维度的长度等于 1 的实体,则 grouptransform 会重复该值,使输出与输入具有相同的行数。

数据类型: char | string | function_handle

要对其进行操作的表变量,指定为下表中的选项之一。datavars 指示将方法应用于输入表或时间表的哪些变量。表中未由 datavars 指定的其他变量会传递给输出,而不会对其进行操作。当未指定 datavars 时,grouptransform 对每个非分组变量进行操作。

选项说明示例
变量名称

指定单个表变量名称的字符向量或标量字符串

'Var1'

"Var1"

变量名称的向量

字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称

{'Var1' 'Var2'}

["Var1" "Var2"]

变量索引的标量或向量

表变量索引的标量或向量

1

[1 3 5]

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。

[true false true]

函数句柄

函数句柄,以表变量作为输入并返回逻辑标量

@isnumeric

vartype 下标

vartype 函数生成的表下标

vartype('numeric')

示例: grouptransform(T,groupvars,method,["Var1" "Var2" "Var4"])

分 bin 方案,指定为下列选项之一:

  • 'none',表示不分 bin

  • bin 边界列表,指定为数值向量或 datetime 分组变量的 datetime 向量

  • bin 的数量,指定为整数标量

  • 持续时间,指定为 durationcalendarDuration 类型的标量,指示 bin 的宽度(仅限于 datetimeduration 分组变量)

  • 列出每个分组变量的分 bin 规则的元胞数组

  • 时间 bin(仅适用于 datetimeduration 分组变量),指定为下列字符向量之一:

    说明数据类型
    'second'

    每个 bin 是 1 秒。

    datetimeduration
    'minute'

    每个 bin 是 1 分钟。

    datetimeduration
    'hour'

    每个 bin 是 1 小时。

    datetimeduration
    'day'

    每个 bin 表示 1 个日历日。此值将夏令时变化考虑在内。

    datetimeduration
    'week'每个 bin 是 1 个日历周。仅限 datetime
    'month'每个 bin 是 1 个日历月。仅限 datetime
    'quarter'每个 bin 是 1 个日历季度。仅限 datetime
    'year'

    每个 bin 表示 1 个日历年。此值将闰日考虑在内。

    datetimeduration
    'decade'每个 bin 是 1 个十年(10 个日历年)。仅限 datetime
    'century'每个 bin 是 1 个世纪(100 个日历年)。仅限 datetime
    'secondofminute'

    bin 从 0 到 59 秒。

    仅限 datetime
    'minuteofhour'

    bin 从 0 到 59 分钟。

    仅限 datetime
    'hourofday'

    bin 从 0 到 23 小时。

    仅限 datetime
    'dayofweek'

    bin 从 1 到 7 日。一周的第一天是星期天。

    仅限 datetime
    'dayname'bin 是一周中某天的全称,例如 'Sunday'仅限 datetime
    'dayofmonth'bin 从 1 到 31 天。仅限 datetime
    'dayofyear'bin 从 1 到 366 天。仅限 datetime
    'weekofmonth'bin 从 1 到 6 周。仅限 datetime
    'weekofyear'bin 从 1 到 54 周。仅限 datetime
    'monthname'bin 是完整的月份名称,如 'January'仅限 datetime
    'monthofyear'

    bin 从 1 到 12 个月。

    仅限 datetime
    'quarterofyear'bin 从 1 到 4 个季度。仅限 datetime

如果指定多个分组变量,则可以提供应用于所有分组变量的单个分 bin 规则,或者提供包含针对每个分组变量(例如 {'none',[0 2 4 Inf]})的分 bin 方法的元胞数组。

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: G = grouptransform(T,groupvars,groupbins,'zscore','IncludedEdge','right')

包括的 bin 边界,指定为 'left''right',指示包括 bin 区间的哪一边。

此名称-值对组只能在指定 groupbins 时指定,并且值适用于所有分组变量或向量的所有分 bin 方案。

转换数据位置指示符,指定为数值或逻辑值 1 (true) 或 0 (false)。当参数值为 true 时,grouptransform 输出表或数组,其中包含转换后的数据,代替了来自输入的非分组变量或向量。当参数值为 false 时,grouptransform 将转换后的数据作为附加矩阵列或表变量追加到输入数据中。

输出参数

全部折叠

输出表,以包含各组转换后数据的表或时间表的形式返回。

输出数组,返回为包含转换后的数据的向量或矩阵。

数组输入数据的分组向量,以列向量或列向量元胞数组形式返回。

提示

  • 当多次调用 grouptransform 时,请考虑尽可能将分组变量转换为 categoricallogical 类型以提高性能。例如,如果您有 char 类型的分组变量(例如 Gender,其中元素为 'Male''Female'),您可以使用命令 categorical(Gender) 将其转换为分类值。

扩展功能

在 R2018b 中推出