在表格中按组计算
你可以使用以下函数对表变量中的数据组执行计算:
groupsummary
,groupcounts
,groupfilter
,grouptransform
varfun
而且rowfun
findgroups
而且splitapply
在大多数情况下,groupsummary
是分组计算的推荐函数。它使用简单,并返回一个带有描述结果的标签的表。然而,其他列出的函数也提供了在某些情况下有用的功能。
从文件中创建表
电子表格示例outages.csv
包含代表美国公用事业电力中断的数据值。要从该文件创建表,请使用readtable
函数。要将文本数据从文件读入字符串数组的表变量,请指定TextType
名称-值参数为“字符串”
.
中断=可读(“outages.csv”,“TextType”,“字符串”)
中断=1468×6表区域OutageTime Loss Customers RestorationTime Cause ___________ ________________ ________________ ________________ _________________ "SouthWest" 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 "winter storm" " southeastern " 2003-01-23 00:49 530.14 2.1204e+05 NaT "winter storm" " southeastern " 2003-02-07 21:15 289.4 1.4294e+05 2003-02-07 21:15 "winter storm" "West" 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 "equipment fault" "MidWest" 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23“猛烈风暴”“西部”2003-06-18 02:49 00 2003-06-18 10:54“攻击”“西部”2004-06-20 14:39 231.29 NaN 2004-06-20 19:16“设备故障”“西部”2002-06-06 19:28 311.86 NaN 2002-06-07 00:51“设备故障”“东北”2003-07-16 16:23 239.93 49434 2003-07-17 01:12“火灾”“中西部”2004-09-27 11:09 286.72 66104 2004-09-27 16:37“设备故障”“东南”2004-09-05 17:48 73.387 36073 2004-09-05 20:46“设备故障”“西部”2004-05-21 21:45 159.99 NaN 2004-05-22 04:23“设备故障”“东南”2002年09月01日18:22 95.917 36759 2002年09月01日19:12“强风暴”“东南”2003年09月27日07:32 NaN 3.5517e+05 2003年10月04日07:02“强风暴”“西”2003年11月12日06:12 254.09 9.2429e+05 2003年11月17日02:04“冬季风暴”“东北”2004年09月18日05:54 00 NaT“设备故障”\
创建分类
分组计算变量
表变量可以是任何数据类型。但从概念上讲,你也可以认为表有两种一般的变量:数据变量而且分组变量.
数据变量使您能够描述单个事件或观察结果。例如,在
中断
你可以想想OutageTime
,损失
,客户
,RestorationTime
变量作为数据变量。分组变量使您能够将具有共同点的事件或观察结果分组在一起。例如,在
中断
你可以想想地区
而且导致
变量作为分组变量。您可以将同一区域或同一原因发生的断电情况进行分组分析。
通常,分组变量包含一组指定的固定值类别.类别指定数据值可以归属的组。的分类
数据类型可以是使用类别的方便类型。
转换地区
而且导致
来分类
变量,使用convertvars
函数。
停机= convertvars(停机,[“地区”,“原因”),“分类”)
中断=1468×6表地区OutageTime损失客户恢复时间原因_________ ________________ ________________ ________________ _______________西南2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50冬季风暴东南2003-01-23 00:49 530.14 2.1204e+05 NaT冬季风暴东南2003-02-07 21:15 289.4 1.4294e+05 2003-02-07 21:15 289.4 1.4294e+05 2003-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10设备故障中西部2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23强风暴西部2003-06-18 02:49 00 2003-06-18 10:54攻击西部2004-06-20 14:39 231.29 NaN 2004-06-20 19:16设备故障西部2002-06-06 19:28 311.86 NaN 2002-06-07 00:51设备故障东北2003-07-16 16:23 239.93 49434 2003-07-17 01:12 fire中西部2004-09-27 11:09 286.72 66104 2004-09-05 17:48 73.387 36073 2004-09-05 20:46设备故障西部2004-05-21 21:45 159.99 NaN 2004-05-22 04:23设备故障东南2002-09-01 18:22 95.917 36759 2002-09-0119:12强风暴东南方向2003-09-27 07:32南3.5517e+05 2003-10-04 07:02强风暴西部方向2003-11-12 06:12 254.09 9.2429e+05 2003-11-17 02:04冬季风暴东北方向2004-09-18 05:54 00 NaT设备故障
在表中按组计算统计信息
可以使用等函数在表中按组计算统计信息groupsummary
,varfun
,splitapply
.这些函数使您能够指定表中的数据组和对每个组执行计算的方法。可以将结果存储在另一个表或输出数组中。
例如,确定中每个区域因停电而受影响的平均电力损失和客户中断
表格执行此计算的推荐方法是使用groupsummary
函数。指定地区
作为分组变量,的意思是
作为方法适用于每个组,并损失
而且客户
作为数据变量。的输出中列出了区域地区
变量),每个区域的停电次数(在GroupCount
变量),以及每个区域的平均功率损失和受影响的客户(中)mean_Loss
而且mean_Customers
变量,分别)。
meanLossByRegion = groupsummary(停机,“地区”,“的意思是”, (“损失”,“顾客”])
meanLossByRegion =5×4表区域GroupCount mean_Loss mean_Customers _________ __________ _________ ______________中西部142 1137.7 2.4015e+05东北557 551.65 1.4917e+05东南389 495.35 1.6776e+05西南26 493.88 2.6975e+05西部354 433.37 1.5201e+05
的groupsummary
推荐使用函数,原因如下:
您可以指定许多常用方法(例如
马克斯
,最小值
,的意思是
),不使用函数句柄。您可以在一次调用中指定多个方法。
南
年代,NaT
S和其他数据变量中缺失的值自动被删除省略了计算结果时。
第三点解释了为什么mean_Loss
而且mean_Customers
变量没有南
S在meanLossByRegion
输出表。
在一次调用中指定多个方法groupsummary
,将它们列在一个数组中。例如,按区域计算最大、平均和最小功耗。
lossStatsByRegion = groupsummary(中断,“地区”, (“马克斯”,“的意思是”,“最小值”),“损失”)
lossStatsByRegion =5×5表区域GroupCount max_Loss mean_Loss min_Loss _________ __________ ________ _________ ________中西部142 23141 1137.7 0东北557 23418 551.65 0东南389 8767.3 495.35 0西南26 2796 493.88 0西部354 16659 433.37 0
每个区域的最小损失为零。若要仅分析导致损失大于零的那些中断,请排除中断
其中损失为零。首先创建一个逻辑索引向量,其值是逻辑的1
(真正的
)用于以下行中断。损失
大于零。然后索引到中断
返回只包含这些行的表。同样,按区域计算最大、平均和最小功率损耗。
nonZeroLossIndices =停机。损失> 0;nonZeroLossOutages = outages(nonZeroLossIndices,:);nonZeroLossStats = groupsummary(nonZeroLossOutages,“地区”, (“马克斯”,“的意思是”,“最小值”),“损失”)
nonZeroLossStats =5×5表区域GroupCount max_Loss mean_Loss min_Loss _________ __________ ________ _________ ________中西部81 23141 1264.1 8.9214东北180 23418 827.47 0.74042东南234 8767.3 546.16 2.3096西南23 2796 515.35 27.882西部175 16659 549.76 0.71847
使用分组计算的替代函数
还有其他函数可以在表中执行分组计算。而groupsummary
是推荐的,替代函数在某些情况下也很有用。
的
varfun
函数对变量执行计算。它类似于groupsummary
,但varfun
可以执行分组和非分组计算。的
rowfun
函数沿行执行计算。您可以指定接受多个输入或返回多个输出的方法。的
findgroups
而且splitapply
函数可以对变量或行执行计算。您可以指定接受多个输入或返回多个输出的方法。的输出splitapply
是数组,不是表。
调用varfun
在变量
例如,按区域计算最大功率损耗varfun
.的输出表具有类似的格式groupsummary
.
maxLossByVarfun = varfun(@max,...中断,...“数据源”,“损失”,...“GroupingVariables”,“地区”)
maxLossByVarfun =5×3表区域GroupCount max_Loss _________ __________ ________中西部142 23141东北557 23418东南389 8767.3西南26 2796西部354 16659
然而,当您使用时,会有显著的差异varfun
:
必须始终使用函数句柄指定方法。
只能指定一个方法。
你可以分组执行或未分组的计算。
南
年代,NaT
S和其他数据变量中缺失的值自动被删除包括计算结果时。
最后一点是行为上的显著差异groupsummary
而且varfun
.例如,损失
变量南
s.如果你使用varfun
要计算平均损失,则默认结果为南
S,不像默认值groupsummary
结果。
meanLossByVarfun = varfun(@mean,...中断,...“数据源”,“损失”,...“GroupingVariables”,“地区”)
meanLossByVarfun =5×3表Region GroupCount mean_Loss _________ __________ _________中西部142 NaN东北557 NaN东南389 NaN西南26 NaN西354 NaN
使用时省略缺失的值varfun
,将方法包装在匿名函数中,以便您可以指定“omitnan”
选择。
omitnanMean = @(x)(mean(x,“omitnan”));meanLossOmitNaNs = varfun(omitnanMean,...中断,...“数据源”,“损失”,...“GroupingVariables”,“地区”)
meanLossOmitNaNs =5×3表地区GroupCount Fun_Loss _________ __________ ________中西部142 1137.7东北557 551.65东南389 495.35西南26 493.88西部354 433.37
另一点提到了一个不同但相关的用例,即对表变量执行未分组的计算。若要将方法应用于所有表变量而不进行分组,请使用varfun
.例如,计算整个表中最大功率损失和受影响的最大客户数。
maxValuesInOutages = varfun(@max,...中断,...“数据源”, (“损失”,“顾客”])
maxValuesInOutages =1×2表max_Loss max_Customers ________ _____________ 23418年5.9689 e + 06
调用rowfun
对行
的rowfun
函数沿表的行应用方法。在哪里varfun
对每个指定变量逐一应用一个方法,rowfun
接受所有指定的表变量作为方法的输入参数,并应用该方法一次。
例如,计算每个地区每个客户的平均损失。要执行此计算,首先指定一个接受两个输入参数的函数(损失
而且客户
),将损失除以客户数量,然后返回中位数。
medianLossCustFcn = @(loss,customers)(median(loss ./ customers,“omitnan”));
然后调用rowfun
.属性可以指定有意义的输出变量名OutputVariablesNames
名称-值参数。
meanLossPerCustomer = rowfun(medianLossCustFcn,...中断,...“数据源”, (“损失”,“顾客”),...“GroupingVariables”,“地区”,...“OutputVariableNames”,“MedianLossPerCustomer”)
meanLossPerCustomer =5×3表区域GroupCount MedianLossPerCustomer ___________________ _____________________中西部142 0.0042139东北557 0.0028512东南389 0.0032057西南26 0.0026353西部354 0.002527
你也可以使用rowfun
当方法返回多个输出时。例如,使用界限
计算在一次调用中每个区域的最小和最大损失rowfun
.的界限
函数返回两个输出参数。
boundsLossPerRegion = rowfun(@bounds,...中断,...“数据源”,“损失”,...“GroupingVariables”,“地区”,...“OutputVariableNames”, (“MinLoss”,“MaxLoss”])
boundsLossPerRegion =5×4表区域GroupCount MinLoss MaxLoss _________ __________ _______ _______中西部142 0 23141东北557 0 23418东南389 0 8767.3西南26 0 2796西部354 0 16659
调用findgroups
而且splitapply
关于变量或行
您可以使用findgroups
函数定义组,然后使用splitapply
对每个组应用一种方法。的findgroups
函数返回一个组号向量,用于标识一行数据属于哪个组。的splitapply
函数返回应用于组的方法的输出的数字数组。
例如,按区域计算最大功率损耗findgroups
而且splitapply
.
G = findgroups(services . region)
G =1468×14 3 3 5 1 5 5 5 2 1
maxLossArray = splitapply(@max, fails . loss,G)
maxLossArray =5×1104× 2.3141 2.3418 0.8767 0.2796 1.6659
就像rowfun
,splitapply
使您能够指定返回多个输出的方法。计算最小值和最大值界限
.
[minLossArray,maxLossArray] = splitapply(@bounds, servers . loss,G)
minLossArray =5×10 0 0 0 0
maxLossArray =5×1104× 2.3141 2.3418 0.8767 0.2796 1.6659
您还可以指定接受多个输入的方法。例如,使用medianLossCustFcn
再次计算每个客户损失的中值。但这一次,将每个区域中每个客户的损失中值作为数组返回。
medianLossCustFcn = @(loss,customers)(median(loss ./ customers,“omitnan”));medianlosssarray = splitapply(medianLossCustFcn, servers . loss, servers . customers,G)
medianLossArray =5×10.0042 0.0029 0.0032 0.0026 0.0025
的数值输出findgroups
而且splitapply
的输出不带注释吗groupsummary
.然而,返回数字输出还有其他好处:
的输出
findgroups
在多次调用splitapply
.你可能会想用findgroups
而且splitapply
当你在一个大表格上进行许多分组计算时,为了提高效率。的输出构建结果表,可以创建具有不同格式的结果表
findgroups
而且splitapply
.您可以调用返回多个输出的方法。
的输出
splitapply
到一个现有的表。
向现有表追加新的计算
如果已经有一个结果表,则可以将另一个计算的结果附加到该表。例如,以小时为单位计算每个地区的平均停电持续时间。将平均持续时间作为新变量附加到lossStatsByRegion
表格
首先从恢复时间中减去停电时间,以返回停电的持续时间。方法将这些持续时间转换为小时小时
函数。
D = outages。restationtime - outs . outagetime;H =小时(D)
H =1468×1105× 0.0015 NaN 0.0023 0.000 0.0007 0.0001 0.000 0.0001 0.0001 0.0001
下一个使用的意思是
计算平均持续时间。停机时间有一些南
值,因为停机和恢复时间有一些缺失的值。与以前一样,将方法包装在匿名函数中以指定“omitnan”
选择。
omitnanMean = @(x)(mean(x,“omitnan”));
按地区计算平均停电时间。附加到lossStatsByRegion
作为一个新的表变量。
G = findgroups(services . region);lossStatsByRegion。的意思是_Outage = splitapply(omitnanMean,H,G)
lossStatsByRegion =5×6表地区GroupCount max_Loss mean_Loss min_Loss mean_停电_________ __________ ________ _________ ________ ___________中西部142 23141 1137.7 0 819.25东北557 23418 551.65 0 581.04东南389 8767.3 495.35 0 40.83西南26 2796 493.88 0 59.519西部354 16659 433.37 0 673.45
指定组为箱
还有另一种指定组的方法。与其将类别指定为分组变量中的唯一值,不如将值存储在连续分布的变量中。然后您可以使用这些箱子来指定组。
例如,按年分类停电情况。若要计算每年停电的次数,请使用groupcounts
函数。
outagesByYear = groupcounts(outages,“OutageTime”,“年”)
outagesByYear =13×3表year_OutageTime GroupCount Percent _______________ __________ _______ 2002 36 2.4523 2003 62 4.2234 2004 79 5.3815 2005 74 5.0409 2006 108 7.3569 2007 91 6.1989 2008 115 7.8338 2009 142 9.673 2010 177 12.057 2011 190 12.943 2012 207 14.101 2013 186 12.67 2014 1 0.06812
可视化每年停机的次数。在这个数据集中,每年的数字会随着时间的推移而增加。
栏(outagesByYear.year_OutageTime outagesByYear.GroupCount)
你可以使用groupsummary
以箱为组。例如,按年计算受影响客户和电力损失的中位数。
medianLossesByYear = groupsummary(中断,“OutageTime”,“年”,“中值”, (“顾客”,“损失”])
medianLossesByYear =13×4表year_OutageTime GroupCount median_Customers median_Loss _______________ __________ ________________ ___________ 2002 36 1.7101e+05 277.02 2003 62 1.0204e+05 295.6 2004 79 1.0108e+05 252.44 2005 74 91536 265.16 2006 108 86020 210.08 2007 91 1.0529e+05 232.12 2008 115 86356 205.77 2009 142 63119 83.491 2010 177 66212 155.76 2011 190 48200 75.286 2012 207 66994 78.289 2013 186 55669 69.596 2014 1 NaN NaN
可视化每年受停机影响的客户的中位数。尽管停机次数随着时间的推移而增加,但受影响客户的中位数减少了。
情节(medianLossesByYear“year_OutageTime”,“median_Customers”)
返回的行中断
多年来停电超过75次。索引到中断
在那些年,使用groupfilter
函数。若要查找超过75行的容器,请指定一个匿名函数,该函数返回逻辑数据1
如果一个bin中的行数大于75。
Outages75 = groupfilter(outages,“OutageTime”,“年”,@(x) number (x) > 75)
outages75 =1295×7表区域OutageTime损失客户恢复时间原因year_OutageTime _________ ________________ ________________ ________________ _______________ _______________ West 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 equipment fault 2004 West 2004-06-20 14:39 231.29 NaN 2004-06-20 19:16 equipment fault 2004 MidWest 2004-09-27 11:09 286.72 66104 2004-09-27 16:37 equipment fault 2004 SouthEast 2004-09-05 17:48 73.387 36073 2004-09-05 20:46 equipment fault 2004 West 2004-05-21 21:45 159.99 NaN2004-05-22 04:23 equipment fault 2004 NorthEast 2004-09-18 05:54 0 0 NaT equipment fault 2004 NorthEast 2004-11-13 10:42 NaN 1.4227e+05 2004-11-19 02:31 winter storm 2004 SouthEast 2004-12-06 23:18 NaN 37136 2004-12-14 03:21 winter storm 2004 West 2004-12-21 18:50 112.05 7.985e+05 2004-12-29 03:46 winter storm 2004 NorthEast 2004-12-26 22:18 255.45 1.0444e+05 2004-12-27 14:11 winter storm 2004 SouthWest 2004-06-06 05:27 559.41 2.19e+05 2004-06-06 05:55 equipment fault 2004 MidWest 2004-07-02 09:16 15128 2.0104e+05 2004-07-06 14:11 thunder storm 2004 SouthWest 2004-07-18 14:40 340.35 1.4963e+05 2004-07-26 23:34 severe storm 2004 NorthEast 2004-09-16 19:42 4718 NaN NaT unknown 2004 SouthEast 2004-09-20 12:37 8767.3 2.2249e+06 2004-10-02 06:00 severe storm 2004 MidWest 2004-11-09 18:44 470.83 67587 2004-11-09 21:24 wind 2004 ⋮
行为和建议摘要
使用这些技巧和建议来决定使用哪些函数来执行组计算。
使用分组变量或从numeric,
datetime
,或持续时间
变量。如果要对表格或时间表中的数据进行分组计算,请使用推荐的函数
groupsummary
.相关函数groupcounts
,groupfilter
,grouptransform
也很有用。考虑使用
varfun
自动包含缺失的值(例如南
年代和NaT
S)在对数据组应用方法时。同时,varfun
可以执行分组和非分组计算。考虑使用
findgroups
而且splitapply
为了提高效率,当你在一个大表格上进行许多连续分组计算时。考虑使用
findgroups
而且splitapply
将新数组追加到现有的结果表。使用返回多个输出的方法执行计算,例如
界限
,使用rowfun
或splitapply
.若要使用需要多个输入参数的方法沿行执行计算,请使用任意一种方法
rowfun
或splitapply
.
另请参阅
groupsummary
|groupcounts
|groupfilter
|grouptransform
|varfun
|rowfun
|findgroups
|splitapply
|表格
|分类
|datetime
|持续时间
|readtable
|convertvars
|界限