主要内容

splitapply

将数据分成组并应用函数

描述

例子

Y = splitapply(函数XG分裂X分组由G然后应用这个函数函数给每一组。splitapply返回Y的连接输出函数为各组分开而出X.输入参数G是一个正整数向量,它指定组对应的元素X属于。如果G包含值,splitapply中的对应值省略X当它分裂时X进组。创建G,你可以使用findgroups函数。

splitapply组合的两个步骤Split-Apply-Combine工作流

例子

Y = splitapply(函数XN, X1,…G分裂X1,…,XN分组和应用函数.的splitapply函数调用函数每组一次,对应的元素从X1,…,XN随着N输入参数到函数

例子

Y = splitapply(函数TG拆分表中的变量T分组和应用函数.的splitapply函数处理变量T作为向量、矩阵或单元格数组,这取决于表变量的数据类型。如果TN变量,然后函数必须接受N输入参数。

例子

(日元…,YM] = splitapply(___将变量分成组并应用函数给每一组。函数返回多个输出参数。日元…,的连接输出函数对于分组拆分出来的输入数据变量。函数是否可以返回属于不同类的输出参数,但每次输出的类必须相同函数被称为。您可以将此语法与前面语法的任何输入参数一起使用。

的输出参数的个数函数不必与指定的输入参数数目相同X1,…,XN

例子

全部折叠

按性别计算各组患者的平均身高,并显示结果。

从数据文件中加载患者身高和性别patients.mat

负载病人性别高度
名称大小字节类属性性别100x1 11412 cell高度100x1 800 double

按性别指定组findgroups

G = findgroups(性别);

分裂高度分组由G.按性别计算平均身高。输出参数的第一行是女性患者的平均身高,第二行是男性患者的平均身高。

splitapply (@mean、身高、G)
ans =2×165.1509 - 69.2340

计算各组患者血压读数差异的方差,并显示结果。血压读数包含在两个数据变量中。要计算差异,请使用一个接受两个输入参数的函数。

从数据文件中加载100名患者的血压读数和吸烟数据patients.mat

负载病人收缩压舒张压吸烟者
名称大小字节分类属性舒张期100x1 800双吸烟者100x1 100逻辑收缩期100x1 800双

定义函数作为计算吸烟者和非吸烟者收缩压和舒张压读数差异方差的函数。函数需要两个输入参数。

Func = @(x,y) var(x-y);

使用findgroups而且splitapply将患者数据分组,计算差异的方差。findgroups中返回组标识符吸烟者.的splitapply函数调用函数每组一次,用收缩压而且舒张压作为两个输入参数。

[G,吸烟者]= findgroups(吸烟者);varBP = splitapply(函数c,收缩压,舒张压,G)
varBP =2×144.4459 - 48.6783

创建一个表,其中包含差异的方差,以及每组患者的数量。

numPatients = splitapply(@numel,Smoker,G);T = table(吸烟者,numPatients,varBP)
T =2×3表吸烟者numPatients varBP  _______ ___________ ______ 错误66 48.678 44.446真正34

计算各组患者的最小、中位数和最大权重,并将这些结果作为每个组的数组返回。splitapply连接输出参数,以便将每个组的输出与其他组的输出区分开来。

定义一个函数,将最小值、中值和最大值作为行向量返回。

Mystats = @(x)[min(x) median(x) max(x)];

装载患者体重,性别和吸烟状态patients.mat

负载病人重量性别吸烟者
名称大小字节类属性性别100x1 11412 cell吸烟者100x1 100逻辑权重100x1 800 double

使用findgroups而且splitapply将患者权重分成组,并计算每组的统计数据。

G = findgroups(性别,吸烟者);Y = splitapply(mystats,Weight,G)
Y =4×3111.0000 131.0000 147.0000 115.0000 131.0000 146.0000 158.0000 181.5000 194.0000 164.0000 181.0000 202.0000

在本例中,可以将非标量输出作为行向量返回,因为数据和分组变量是列向量。每行Y包含不同患者组的统计数据。

从患者数据表中计算平均身体质量指数(BMI)。将患者按性别、吸烟或不吸烟进行分组。

加载患者数据并将变量分组到表中。

负载病人DT =表(身高,体重);GT =表(性别,吸烟者);

定义一个函数,根据组或患者的体重和身高计算平均BMI。

meanBMIFcn = @(h,w)mean((w ./ (h.²))* 703);

创建一个包含每组平均BMI的表格。

[G,results] = findgroups(GT);meanBMI = splitapply(meanBMIFcn,DT,G);结果。meanBMI = meanBMI
结果=4×3表性别吸烟者meanBMI  __________ ______ _______ {' 女性的}假21.672{‘女性’}真21.669{‘男性’}假26.578{‘男性’}真26.458

计算各组患者的最低、平均和最高高度,并将结果返回到表格中。

在名为multiStats.m它接受输入向量并返回该向量的最小值、平均值和最大值。

版权所有The MathWorks, Inc.函数[lo,avg,hi] = multiStats(x) lo = min(x);Avg = mean(x);Hi = max(x);结束

将患者数据加载到表中。

负载病人T =表(性别,身高);总结(T)
变量:性别:100x1字符向量单元阵列高度:100x1 double值:Min 60 Median 67 Max 72

按性别分组患者身高。创建一个包含从的输出的表multiStats对于每一组。

[G,性别]= findgroups(T.Gender);[minHeight,meanHeight,maxHeight] = splitapply(@multiStats,T.Height,G);result = table(性别,minHeight,meanHeight,maxHeight)
结果= 2 x4表性别minHeight meanHeight maxHeight  __________ _________ __________ _________ {' 女性的60 70 - 65.151{‘男性’}}66 69.234 72

输入参数

全部折叠

函数应用于作为函数句柄指定的数据组。

如果函数返回一个非标量输出参数,则参数必须定向,以便splitapply可以从连续调用的输出参数连接到函数.例如,如果输入数据变量是列向量,则函数必须返回标量或行向量作为输出参数。

例子:Y = splitapply(@sum,X,G)返回中数据组的和X

数据变量,指定为向量、矩阵或单元格数组。的要素X的对应元素指定的组G

如果X是一个矩阵,splitapply将每一列或行视为单独的数据变量。的定位G决定splitapply的列或行X作为数据变量。

组数字,指定为正整数向量。

  • 如果X是向量数组还是单元格数组G长度必须和X

  • 如果X是矩阵,那么长度是G必须等于的列数或行数X,取决于的方向G

  • 如果输入参数为tableT,然后G一定是列向量。的长度G必须等于的行数T

数据变量,指定为表。splitapply将每个表变量视为单独的数据变量。

更多关于

全部折叠

Split-Apply-Combine工作流

Split-Apply-Combine工作流在数据分析中很常见。在这个工作流中,分析人员将数据分成组,对每个组应用一个函数,并结合结果。该图显示了工作流的典型示例以及由findgroups而且splitapply

扩展功能

版本历史

在R2015b中引入