最近遇到一个问题,Matlab分析得到的mat数据表超出了1048000行,大小达几百兆,无法放到同一个Excel sheet中(一是表太大复制不进去,二是超出了excel 的行数限值),导致致难以通过数据透视实现对总体数据的分析和处理,且容易卡顿。如果能在matlab中是实现数据分析就可以避免这个问题。

前面发布的pivottable函数就可以是实现这个功能,但该函数不属于matlab的内置函数,需要单独下载调用,且访问速度不够快。这里推荐一个groupsummary 函数,可以实现对超大mat文件的数据分析和处理。

https://ww2.mathworks.cn/help/matlab/ref/double.groupsummary.html
本页的翻译已过时。点击此处可查看最新英文版本。

groupsummary

组汇总计算
全页折叠

语法

G = groupsummary(T,groupvars)
G = groupsummary(T,groupvars,method)
G = groupsummary(T,groupvars,method,datavars)
G = groupsummary(T,groupvars,groupbins)
G = groupsummary(T,groupvars,groupbins,method)
G = groupsummary(T,groupvars,groupbins,method,datavars)
G = groupsummary(_,Name,Value)
B = groupsummary(A,groupvars,method)
B = groupsummary(A,groupvars,groupbins,method)
B = groupsummary(_,Name,Value)
[B,BG] = groupsummary(A,_)
[B,BG,BC] = groupsummary(A,_)

说明

示例
G = groupsummary(T,groupvars) 返回一个表,其中包含表或时间表 T 中要进行计算的数据组,以及每组中的元素数。一个组包含 groupvars 中的分组变量的各个唯一组合。例如,G = groupsummary(T,’Gender’) 返回变量 Gender 中 Male 元素的数量和 Female 元素的数量。
示例
G = groupsummary(T,groupvars,method) 还返回 method 所指定计算的结果。例如,G = groupsummary(T,’Gender’,’median’) 除了返回每个组中的元素数量外,还返回 T 中两个性别的所有非分组变量的中位数。
示例
G = groupsummary(T,groupvars,method,datavars) 指定要应用计算的变量。
G = groupsummary(T,groupvars,groupbins) 指定如何为 groupvars 中的数据分 bin。例如,G = groupsummary(T,’SaleDate’,’year’) 根据分组变量 SaleDate 给出每年 T 中所有销售的组计数。
G = groupsummary(T,groupvars,groupbins,method) 根据 groupbins 对数据分 bin 并应用 method 中指定的计算。
示例
G = groupsummary(T,groupvars,groupbins,method,datavars) 根据 groupbins 对数据分 bin,并指定要应用计算的变量。
示例
G = groupsummary(_,Name,Value) 使用一个或多个名称-值对组为上述语法指定其他分组属性。例如,G = groupsummary(T,’Category1’,’IncludeMissingGroups’,false) 将排除由缺失 categorical 数据(通过 指示)构成的组。
当 A 是向量或矩阵时,B = groupsummary(A,groupvars,method) 根据 groupvars 中的分组向量的各个唯一组合返回计算结果。groupvars 可以是列向量、矩阵或列向量元胞数组。
示例
B = groupsummary(A,groupvars,groupbins,method) 根据 groupbins 对数据分 bin。
示例
B = groupsummary(_,Name,Value) 使用一个或多个名称-值对组为上述数组语法指定其他分组属性。
[B,BG] = groupsummary(A,_) 还返回每个分组向量的组。
示例
[B,BG,BC] = groupsummary(A,_) 还返回每个组的组计数。

示例

全部折叠

汇总统计量

尝试此示例
View MATLAB Command
计算表变量的汇总统计量。
创建包含五个人信息的表 T。
Gender = [“male”;”female”;”female”;”male”;”male”]; Age = [38;43;38;40;49]; Height = [71;69;64;67;64]; Weight = [176;163;131;133;119]; T = table(Gender,Age,Height,Weight)
T=5×4 table Gender Age Height Weight __ _ __ “male” 38 71 176 “female” 43 69 163 “female” 38 64 131 “male” 40 67 133 “male” 49 64 119
通过指定 Gender 作为分组变量来计算男性和女性的人数。
G = groupsummary(T,”Gender”)
G=2×2 table Gender GroupCount __ __ “female” 2 “male” 3
分别计算女性和男性的平均年龄、身高和体重。
G = groupsummary(T,”Gender”,”mean”)
G=2×5 table Gender GroupCount meanAge meanHeight meanWeight __ __ __ __ _ “female” 2 40.5 66.5 147 “male” 3 42.333 67.333 142.67
还是按性别分组,只计算身高中位数。
G = groupsummary(T,”Gender”,”median”,”Height”)
G=2×3 table Gender GroupCount medianHeight __ __ __ “female” 2 66.5 “male” 3 67

多个分组变量

尝试此示例
View MATLAB Command
使用两个分组变量对表数据进行分组。
创建包含五个人信息的表 T。
Gender = [“male”;”female”;”male”;”female”;”male”]; Smoker = logical([1;0;1;0;1]); Weight = [176;163;131;133;119]; T = table(Gender,Smoker,Weight)
T=5×3 table Gender Smoker Weight __ __ __ “male” true 176 “female” false 163 “male” true 131 “female” false 133 “male” true 119
按性别和吸烟状况分组,计算平均体重。默认情况下,性别和吸烟状况的两种组合未显示在输出中,因为它们是空组。
G = groupsummary(T,{‘Gender’,’Smoker’},’mean’,’Weight’)
G=2×4 table Gender Smoker GroupCount meanWeight __ __ __ __ “female” false 2 148 “male” true 3 142
将 ‘IncludeEmptyGroups’ 参数值设置为 true 可以查看所有组合,包括空组。
G = groupsummary(T,{‘Gender’,’Smoker’},’mean’,’Weight’,’IncludeEmptyGroups’,true)
G=4×4 table Gender Smoker GroupCount meanWeight __ __ __ __ “female” false 2 148 “female” true 0 NaN “male” false 0 NaN “male” true 3 142

指定组 bin

尝试此示例
View MATLAB Command
根据指定的 bin 对数据进行分组。
创建一个时间表,其中包含一个月内某些日期的销售信息。
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]’; TotalItemsSold = [14 13 8 5 10 16 8 6 7 11]’; TT = timetable(TimeStamps,Profit,TotalItemsSold)
TT=10×2 timetable TimeStamps Profit TotalItemsSold _ __ __ 04-Mar-2017 2032 14 02-Mar-2017 3071 13 15-Mar-2017 1185 8 10-Mar-2017 2587 5 14-Mar-2017 1998 10 31-Mar-2017 2899 16 25-Mar-2017 3112 8 29-Mar-2017 909 6 21-Mar-2017 2619 7 18-Mar-2017 3085 11
按售出的商品总量分组计算平均利润,并将各组按商品编号分成 bin 区间。
format shorte G = groupsummary(TT,’TotalItemsSold’,[0 4 8 12 16],’mean’,’Profit’)
G=3×3 table discTotalItemsSold GroupCount meanProfit _ __ _ [4, 8) 3.0000e+00 2.0383e+03 [8, 12) 4.0000e+00 2.3450e+03 [12, 16] 3.0000e+00 2.6673e+03
按星期几分组计算平均利润。
G = groupsummary(TT,’TimeStamps’,’dayname’,’mean’,’Profit’)
G=5×3 table daynameTimeStamps GroupCount meanProfit __ __ _ Tuesday 2.0000e+00 2.3085e+03 Wednesday 2.0000e+00 1.0470e+03 Thursday 1.0000e+00 3.0710e+03 Friday 2.0000e+00 2.7430e+03 Saturday 3.0000e+00 2.7430e+03

使用向量数据对操作分组

尝试此示例
View MATLAB Command
创建日期向量和对应利润值的向量。
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]’;
按周中日期计算平均利润。显示每个组中的均值、组名称和成员数。
format shorte [meanDailyProfit,dayOfWeek,dailyCounts] = groupsummary(profit,timeStamps,’dayname’,’mean’)
meanDailyProfit = 5×1 2.3085e+03 1.0470e+03 3.0710e+03 2.7430e+03 2.7430e+03
dayOfWeek = 5x1 categorical Tuesday Wednesday Thursday Friday Saturday
dailyCounts = 5×1 2 2 1 2 3

向量输入的多个分组向量

尝试此示例
View MATLAB Command
根据性别和是否为吸烟者计算四个组的平均体重。
将患者信息存储为三种不同类型的向量。
Gender = [“male”;”female”;”male”;”female”;”male”]; Smoker = logical([1;0;1;0;1]); Weight = [176;163;131;133;119];
按性别和是否为吸烟者分组,计算平均体重。B 包含每个组的均值(空组为 NaN)。BG 是包含两个向量的元胞数组,用于描述按行查看其元素时的组。例如,BG{1} 的第一行表示第一组中的患者是女性,BG{2} 的第一行表示她们是非吸烟者。最后,BC 包含 BG 中对应组的每个组中的成员数。
[B,BG,BC] = groupsummary(Weight,{Gender,Smoker},’mean’,’IncludeEmptyGroups’,true); B
B = 4×1 148 NaN NaN 142
BG{1}
ans = 4x1 string “female” “female” “male” “male”
BG{2}
ans = 4x1 logical array 0 1 0 1
BC
BC = 4×1 2 0 0 3

具有多个输入的方法函数句柄

尝试此示例
View MATLAB Command
加载包含患者信息的数据,并创建一个表,说明每个患者的性别、收缩压和舒张压、身高和体重。
load patients T = table(Gender,Systolic,Diastolic,Height,Weight)
T=100×5 table Gender Systolic Diastolic Height Weight __ __ _ __ __ {‘Male’ } 124 93 71 176 {‘Male’ } 109 77 69 163 {‘Female’} 125 83 64 131 {‘Female’} 117 75 67 133 {‘Female’} 122 80 64 119 {‘Female’} 121 70 68 142 {‘Female’} 130 88 64 142 {‘Male’ } 115 82 68 180 {‘Male’ } 115 78 68 183 {‘Female’} 118 86 66 132 {‘Female’} 114 77 68 128 {‘Female’} 115 68 66 137 {‘Male’ } 127 74 71 174 {‘Male’ } 130 95 72 202 {‘Female’} 114 79 65 129 {‘Male’ } 130 92 71 181 ⋮
按性别分组,计算患者身高和体重的相关性以及收缩压和舒张压的相关性。使用 xcov 函数作为计算相关性的方法。xcov 的前两个输入参数说明要关联的数据,第三个参数说明滞后大小,第四个参数说明归一化的类型。对于每组计算,传入 xcov 中的 x 和 y 参数由 [“Height”,”Systolic”] 和 [“Weight”,”Diastolic”] 这两个元胞元素中的变量成对指定。
G = groupsummary(T,”Gender”,@(x,y)xcov(x,y,0,’coeff’),{[“Height”,”Systolic”],[“Weight”,”Diastolic”]})
G=2×4 table Gender GroupCount fun1HeightWeight fun1SystolicDiastolic __ __ __ _ {‘Female’} 53 0.071278 0.48731 {‘Male’ } 47 0.047571 0.50254
或者,如果您的数据是向量或矩阵形式,而不是表形式,您可以将要关联的数据作为 groupsummary 的第一个输入参数提供。
[G,GR,GC] = groupsummary({[Height,Systolic],[Weight,Diastolic]},Gender,@(x,y)xcov(x,y,0,’coeff’))
G = 2×2 0.0713 0.4873 0.0476 0.5025
GR = 2x1 cell {‘Female’} {‘Male’ }
GC = 2×1 53 47

输入参数

全部折叠

T - 输入数据
表 | 时间表

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

A - 输入数组
向量 | 矩阵 | 元胞数组

输入数组,指定为向量、矩阵或者由向量或矩阵组成的元胞数组。
当您为接受多个输入参数的 method 函数指定函数句柄时,输入数据 A 必须为向量或矩阵元胞数组。每次按组调用该函数时,输入参数是元胞数组中每个元素的对应列。例如:

  • groupsummary({x1, y1},groupvars,@(x,y) myFun(x,y)) 为每个组计算 myFun(x1,y1)。
  • groupsummary({[x1 x2], [y1 y2]},groupvars,@(x,y) myFun(x,y)) 首先为每个组计算 myFun(x1,y1),然后为每个组计算 myFun(x2,y2)。

    groupvars - 分组变量或向量
    标量 | 向量 | 矩阵 | 元胞数组 | 函数句柄 | 表 vartype 下标

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

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

  • 对于表或时间表输入,groupvars 指示使用哪些变量来计算数据中的组。您可以使用下表中的任何选项来指定分组变量。 | 选项 | 说明 | 示例 | | —- | —- | —- | | 标量变量名称 | 指定单个表变量名称的字符向量或标量字符串。 | ‘Var1’
    “Var1” | | 变量名称的向量 | 字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称。 | {‘Var1’ ‘Var2’}
    [“Var1” “Var2”] | | 变量索引的标量或向量 | 表变量索引的标量或向量。 | 1
    [1 3 5] | | 逻辑标量或向量 | 逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。 | [true false true] | | 函数句柄 | 函数句柄,以表变量作为输入并返回逻辑标量。 | @isnumeric | | vartype 下标 | 由 vartype 函数生成的表下标。 | vartype(‘numeric’) |

示例: groupsummary(T,”Var3”)

method - 计算方法
‘sum’ | ‘mean’ | ‘median’ | ‘mode’ | ‘var’ | ‘std’ | ‘min’ | ‘max’ | ‘range’ | ‘nummissing’ | ‘nnz’ | ‘all’ | 函数句柄 | 元胞数组

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

  • ‘sum’ - 总和
  • ‘mean’ - 均值
  • ‘median’ - 中位数
  • ‘mode’ - 模
  • ‘var’ - 方差
  • ‘std’ - 标准差
  • ‘min’ - 最小值
  • ‘max’ - 最大值
  • ‘range’ - 最大值减去最小值
  • ‘nummissing’ - 缺失元素的数量
  • ‘nnz’ - 非零和非 NaN 元素的数量
  • ‘all’ - 上面列出的所有计算

您也可以将 method 指定为函数句柄,该句柄为每个第一个维度长度为 1 的组返回一个实体。对于表输入数据,该函数单独对每个表变量进行操作。
当输入数据是表 T 并且您为接受多个输入参数的 method 函数指定了函数句柄时,您必须指定 datavars。datavars 参数必须为元胞数组,其元素指示用于方法的每个输入的表变量。每次按组调用该函数时,输入参数是元胞数组元素的对应表变量。例如:

  • groupsummary(T,groupvars,@(x,y) myFun(x,y),{“x1”,”y1”}) 为每个组计算 myFun(T.x1,T.y1)。
  • groupsummary(T,groupvars,@(x,y) myFun(x,y),{[“x1” “x2”],[“y1” “y2”]}) 首先为每个组计算 myfun(T.x1,T.y1),然后为每个组计算 myfun(T.x2,T.y2)。

当输入数据为向量或矩阵形式并且您为接受多个输入参数的 method 函数指定句柄时,输入数据 A 必须为向量或矩阵的元胞数组。在对该函数的每次调用中,输入参数是元胞数组中每个元素的对应列。例如:

  • groupsummary({x1,y1},groupvars,@(x,y) myFun(x,y)) 为每个组计算 myFun(x1,y1)。
  • groupsummary({[x1 x2],[y1 y2]},groupvars,@(x,y) myFun(x,y)) 首先为每个组计算 myFun(x1,y1),然后为每个组计算 myFun(x2,y2)。

要一次指定多个计算,请列出元胞数组中的选项,例如 {‘mean’,’median’} 或 {myFun1,myFun2}。
在使用此处描述的方法名称时,输入数据中的 NaN 值会自动省略,但 ‘nummissing’ 除外。要包含 NaN 值,请考虑对该方法使用函数句柄,例如 @sum,而不是 ‘sum’。
数据类型: char | string | cell | function_handle

datavars - 要对其进行操作的表变量
标量 | 向量 | 元胞数组 | 函数句柄 | 表 vartype 下标

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

选项 说明 示例
变量名称 指定单个表变量名称的字符向量或标量字符串 ‘Var1’
“Var1”
变量名称的向量 字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称 {‘Var1’ ‘Var2’}
[“Var1” “Var2”]
变量索引的标量或向量 表变量索引的标量或向量 1
[1 3 5]
逻辑向量 逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。 [true false true]
函数句柄 函数句柄,以表变量作为输入并返回逻辑标量 @isnumeric
vartype 下标 vartype 函数生成的表下标 vartype(‘numeric’)

当输入数据是表 T 并且您为接受多个输入参数的 method 函数指定了函数句柄时,您必须指定 datavars。datavars 参数必须为元胞数组,其元素是表中的任一选项。元胞数组元素指示用于方法的每个输入的表变量。每次按组调用该函数时,输入参数是元胞数组元素的对应表变量。例如:

  • groupsummary(T,groupvars,@(x,y) myFun(x,y),{“x1”, “y1”}) 为每个组计算 myFun(T.x1,T.y1)。
  • groupsummary(T,groupvars,@(x,y) myFun(x,y),{[“x1” “x2”],[“y1” “y2”]}) 首先为每个组计算 myfun(T.x1,T.y1),然后为每个组计算 myfun(T.x2,T.y2)。

示例: groupsummary(T,groupvars,method,[“Var1” “Var2” “Var4”])

groupbins - 分 bin 方案
‘none’ (默认) | 向量 | 标量 | 元胞数组

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

  • ‘none’,表示不分 bin
  • bin 边界列表,指定为数值向量,或 datetime 分组变量或向量的 datetime 向量
  • bin 的数量,指定为整数标量
  • 持续时间,指定为 duration 或 calendarDuration 类型的标量,指示 bin 的宽度(仅限于 datetime 或 duration 分组变量或向量)
  • 时间 bin(仅适用于 datetime 和 duration 分组变量或向量),指定为下列字符向量之一: | | 说明 | 数据类型 | | —- | —- | —- | | ‘second’ | 每个 bin 是 1 秒。 | datetime 和 duration | | ‘minute’ | 每个 bin 是 1 分钟。 | datetime 和 duration | | ‘hour’ | 每个 bin 是 1 小时。 | datetime 和 duration | | ‘day’ | 每个 bin 表示 1 个日历日。此值将夏令时变化考虑在内。 | datetime 和 duration | | ‘week’ | 每个 bin 是 1 个日历周。 | 仅限 datetime | | ‘month’ | 每个 bin 是 1 个日历月。 | 仅限 datetime | | ‘quarter’ | 每个 bin 是 1 个日历季度。 | 仅限 datetime | | ‘year’ | 每个 bin 表示 1 个日历年。此值将闰日考虑在内。 | datetime 和 duration | | ‘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 规则的元胞数组

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

名称-值对组参数

示例: G = groupsummary(T,groupvars,groupbins,’IncludedEdge’,’right’)
指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,…,NameN,ValueN 所示。

IncludedEdge - 包括的 bin 边界
‘left’ (默认) | ‘right’

包括的 bin 边界,指定为 ‘left’ 或 ‘right’,指示包括 bin 区间的哪一边。
此名称-值对组只能在指定 groupbins 时指定,并且值适用于所有分组变量或向量的所有分 bin 方案。

IncludeMissingGroups - 缺失组指示符
true (默认) | false

缺失组指示符,指定为 true 或 false。当参数值为 true 时,groupsummary 显示由缺失值(例如 NaN)组成的组。当参数值为 false 时,groupsummary 不显示缺失组。
数据类型: logical

IncludeEmptyGroups - 空组指示符
false (默认) | true

空组指示符,指定为 true 或 false。当参数值为 false 时,groupsummary 不显示元素数为零的组。当参数值为 true 时,groupsummary 显示空组。
数据类型: logical

输出参数

全部折叠

G - 输出表

输出表,返回为包含每个组的指定计算结果的表。

B - 输出数组
向量 | 矩阵

输出数组,以包含组计算结果的向量或矩阵形式返回。指定多个方法时,groupsummary 按照计算的列出顺序水平串联计算。

BG - 组
列向量 | 列向量元胞数组

数组输入数据的组,以列向量或列向量元胞数组形式返回,每个列向量对应于一个分组向量。
当您提供多个分组向量时,BG 是包含相等长度的列向量的元胞数组。通过在 BG 的所有向量中按行查看元素,可以找到组信息。每组映射到输出数组 B 的对应行。

BC - 组计数
列向量

数组输入数据的组计数,返回为一个列向量,其中包含每个组中的元素数。BC 的长度与在 BG 中返回的组列向量的长度相同。