主要内容

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单元格高度100x1 800双

按性别指定组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);

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

[G,吸烟者]= findgroups(吸烟者);varBP = splitapply(function,收缩压,舒张压,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细胞吸烟者100x1 100逻辑重量100x1 800双

使用findgroupssplitapply将患者体重分组,并对每组进行统计。

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 = table(Height,Weight);GT = table(性别,吸烟者);

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

meanBMIFcn = @(h,w)mean((w ./ (h.^2)) * 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它接受一个输入向量,并返回该向量的最小值、平均值和最大值。

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

将患者数据加载到表中。

负载病人T = table(性别,身高);总结(T)
变量:性别:100x1字符向量的单元数组高度:100x1双精度值:最小60中位数67最大72

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

[G,gender] = findgroups(T.Gender);[minHeight,meanHeight,maxHeight] = splitapply(@multiStats,T.Height,G);result = table(gender,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工作流在数据分析中很常见。在此工作流中,分析人员将数据分成几组,对每一组应用一个函数,并合并结果。该图显示了工作流的一个典型示例以及由findgroupssplitapply

扩展功能

版本历史

在R2015b中引入