主要内容

在表格中按组计算

你可以使用以下函数对表变量中的数据组执行计算:

  • groupsummarygroupcountsgroupfilter,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设备故障

在表中按组计算统计信息

可以使用等函数在表中按组计算统计信息groupsummaryvarfun,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推荐使用函数,原因如下:

  • 您可以指定许多常用方法(例如马克斯最小值,的意思是),不使用函数句柄。

  • 您可以在一次调用中指定多个方法。

  • 年代,NaTS和其他数据变量中缺失的值自动被删除省略了计算结果时。

第三点解释了为什么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:

  • 必须始终使用函数句柄指定方法。

  • 只能指定一个方法。

  • 你可以分组执行未分组的计算。

  • 年代,NaTS和其他数据变量中缺失的值自动被删除包括计算结果时。

最后一点是行为上的显著差异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

就像rowfunsplitapply使您能够指定返回多个输出的方法。计算最小值和最大值界限

[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)

图中包含一个轴对象。axis对象包含一个bar类型的对象。

你可以使用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”)

图中包含一个轴对象。axis对象包含一个line类型的对象。

返回的行中断多年来停电超过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.相关函数groupcountsgroupfilter,grouptransform也很有用。

  • 考虑使用varfun自动包含缺失的值(例如年代和NaTS)在对数据组应用方法时。同时,varfun可以执行分组和非分组计算。

  • 考虑使用findgroups而且splitapply为了提高效率,当你在一个大表格上进行许多连续分组计算时。

  • 考虑使用findgroups而且splitapply将新数组追加到现有的结果表。

  • 使用返回多个输出的方法执行计算,例如界限,使用rowfunsplitapply

  • 若要使用需要多个输入参数的方法沿行执行计算,请使用任意一种方法rowfunsplitapply

另请参阅

||||||||||||||

相关的话题