Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

splitapply

将数据划分归组并应用函数

说明

要将数据分成若干组并将函数应用于这些组,请同时使用 findgroupssplitapply 函数。有关数据组计算的详细信息,请参阅对数据组的计算

示例

Y = splitapply(func,X,G)X 划分为由 G 指定的若干组,并将函数 func 应用于每个组。然后 splitapply 以数组形式返回 Y,其中包含对从 X 划分出的组应用 func 后的串联输出。输入参量 G 是由正整数组成的向量,用于指定 X 的对应元素属于哪个组。如果 G 包含 NaN 值,则 splitapply 在将 X 划分归组时会省略 X 中的对应值。

要创建 G,请先使用 findgroups 函数。然后使用 splitapply

示例

Y = splitapply(func,X1,...,XN,G)X1,...,XN 划分归组并应用 funcsplitapply 函数对每个组调用一次 func,同时将来自 X1,...,XN 的对应元素作为 funcN 个输入参量。

示例

Y = splitapply(func,T,G) 将表 T 的变量划分归组并应用 funcsplitapply 函数将 T 的变量视为向量、矩阵或元胞数组,具体取决于表变量的数据类型。如果 TN 个变量,则 func 必须接受 N 个输入参量。

示例

[Y1,...,YM] = splitapply(___) 将变量划分归组并向每个组应用 funcfunc 返回多个输出参量。Y1,...,YM 包含对从输入数据变量划分出的组应用 func 后的串联输出。func 可以返回属于不同类的输出参量,但在每次调用 func 时每个输出的类必须是相同的。您可将此语法与上述语法中的任何输入参量一起使用。

func 返回的输出参量的数量不必与 X1,...,XN 指定的输入参量的数量相同。

示例

全部折叠

使用组编号将患者体重测量值分为吸烟者和非吸烟者两个体重组。然后,计算每组患者的平均体重。

从示例文件 patients.mat 中加载患者数据。

load patients
whos Smoker Weight
  Name          Size            Bytes  Class      Attributes

  Smoker      100x1               100  logical              
  Weight      100x1               800  double               

findgroups 指定组。G 的每个元素均为组编号,用于指定患者所在的组。组 1 包含非吸烟者,组 2 包含吸烟者。

G = findgroups(Smoker)
G = 100×1

     2
     1
     1
     1
     1
     1
     2
     1
     1
     1
      ⋮

显示患者的体重。

Weight
Weight = 100×1

   176
   163
   131
   133
   119
   142
   142
   180
   183
   132
      ⋮

使用 GWeight 数组分成两个体重组。应用 mean 函数。非吸烟者的平均体重略低于吸烟者的平均体重。

meanWeights = splitapply(@mean,Weight,G)
meanWeights = 2×1

  149.9091
  161.9412

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

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

load patients
whos Systolic Diastolic Smoker
  Name             Size            Bytes  Class      Attributes

  Diastolic      100x1               800  double               
  Smoker         100x1               100  logical              
  Systolic       100x1               800  double               

func 定义为一个函数,用于计算烟民和非烟民的收缩压和舒张压血压读数之间差异的方差。func 要求两个输入参量。

func = @(x,y) var(x-y)
func = function_handle with value:
    @(x,y)var(x-y)

使用 findgroupssplitapply 将患者数据划分归组并计算差异的方差。findgroups 还会返回 smokers 中的组标识符。splitapply 函数对每个组调用一次 func,且使用 SystolicDiastolic 作为两个输入参量。

[G,smokers] = findgroups(Smoker);
varBP = splitapply(func,Systolic,Diastolic,G)
varBP = 2×1

   44.4459
   48.6783

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

numPatients = splitapply(@numel,Smoker,G);
T = table(smokers,numPatients,varBP)
T=2×3 table
    smokers    numPatients    varBP 
    _______    ___________    ______

     false         66         44.446
     true          34         48.678

计算各患者组的最小、中位数和最大体重,并以数组形式返回每个组的这些结果。splitapply 会串联各输出参量,以便您能够区分各个组的输出。

定义一个函数,它以行向量形式返回最小值、中位数和最大值。

mystats = @(x)[min(x) median(x) max(x)]
mystats = function_handle with value:
    @(x)[min(x),median(x),max(x)]

从示例文件 patients.mat 加载患者体重、医院位置和是否为吸烟者的状态信息。

load patients
whos Weight Location Smoker
  Name            Size            Bytes  Class      Attributes

  Location      100x1             14208  cell                 
  Smoker        100x1               100  logical              
  Weight        100x1               800  double               

使用 findgroupssplitapply 将患者体重划分归组并计算每个组的统计量。

G = findgroups(Location,Smoker);
Y = splitapply(mystats,Weight,G)
Y = 6×3

  111.0000  137.0000  194.0000
  120.0000  170.5000  189.0000
  118.0000  134.0000  189.0000
  115.0000  170.0000  191.0000
  117.0000  140.0000  189.0000
  126.0000  178.0000  202.0000

在此示例中,您可以行向量形式返回非标量输出,因为数据和分组变量是列向量。Y 的每一行包含一个不同患者组的统计量。

根据患者数据表计算中位身体-质量-索引 (BMI)。根据医院位置和状态将患者分为吸烟者和非吸烟者。

将示例文件 patients.mat 中的患者数据和分组变量加载到表中。(将医院位置转换为一个字符串数组。)

load patients
DT = table(Height,Weight);
Location = string(Location);
GT = table(Location,Smoker);

定义一个函数,以根据组别或患者的体重和身高计算中位 BMI。

meanBMIFcn = @(h,w)mean((w ./ (h.^2)) * 703)
meanBMIFcn = function_handle with value:
    @(h,w)mean((w./(h.^2))*703)

创建一个表,其中包含每个组的中位 BMI。

[G,results] = findgroups(GT);
meanBMI = splitapply(meanBMIFcn,DT,G);
results.meanBMI = meanBMI
results=6×3 table
             Location              Smoker    meanBMI
    ___________________________    ______    _______

    "County General Hospital"      false     23.774 
    "County General Hospital"      true      24.865 
    "St. Mary's Medical Center"    false     22.968 
    "St. Mary's Medical Center"    true      24.905 
    "VA Hospital"                  false     23.946 
    "VA Hospital"                  true      24.227 

计算患者组的最小、均值和最大体重,并在表中返回结果。

将患者数据加载到一个表中。

load patients
T = table(Smoker,Weight)
T=100×2 table
    Smoker    Weight
    ______    ______

    true       176  
    false      163  
    false      131  
    false      133  
    false      119  
    false      142  
    true       142  
    false      180  
    false      183  
    false      132  
    false      128  
    false      137  
    false      174  
    true       202  
    false      129  
    true       181  
      ⋮

根据是否为吸烟者对患者体重进行分组。附加的支持函数 multiStats 以三个输出形式返回输入数组中的最小值、均值和最大值。将 multiStats 应用于吸烟者和非吸烟者。创建一个表,其中包含来自每个组的 multiStats 的输出。

[G,smoker] = findgroups(T.Smoker);
[minWeight,meanWeight,maxWeight] = splitapply(@multiStats,T.Weight,G);
result = table(smoker,minWeight,meanWeight,maxWeight)
result=2×4 table
    smoker    minWeight    meanWeight    maxWeight
    ______    _________    __________    _________

    false        111         149.91         194   
    true         115         161.94         202   

function [lo,avg,hi] = multiStats(x)
    lo = min(x);
    avg = mean(x);
    hi = max(x);
end

输入参数

全部折叠

要对数据组应用的函数,指定为函数句柄。

如果 func 返回非标量输出参量,则参量必须是定向的,以便 splitapply 可以将连续调用 func 所返回的输出参量串联起来。例如,如果输入数据变量为列向量,则 func 必须返回一个标量或行向量作为输出参量。

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

数据变量,指定为向量、矩阵或元胞数组。X 的元素属于由 G 的对应元素指定的组。

如果 X 为矩阵,则 splitapply 将每个列或行视为单独的数据变量。G 的方向确定 splitapply 是将 X 的行还是列视为数据变量。

组编号,指定为由正整数组成的向量。

  • 如果 X 为向量或元胞数组,则 G 的长度必须与 X 相同。

  • 如果 X 为矩阵,则 G 的长度必须等于 X 的行数或列数,具体取决于 G 的方向。

  • 如果输入参量是表 T,则 G 必须为列向量。G 的长度必须等于 T 的行数。

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

详细信息

全部折叠

对数据组的计算

在数据分析中,您通常对数据组执行计算。对于这种计算,您可以将一个或多个数据变量拆分成若干数据组,对每个数据组执行计算,并将结果组合成一个或多个输出变量。您可以使用一个或多个分组变量来指定组。分组变量中的唯一值定义数据变量的对应值所属的组。

例如,该图显示简单的分组计算,该计算将 6×1 数值向量拆分为两组数据,计算每组数据的均值,然后将输出合并为一个 2×1 数值向量。6×1 分组变量有两个唯一值,即 ABXYZ

Calculation that splits a data variable based on a grouping variable, performs calculations on individual groups of data by applying the same function, and then concatenates the outputs of those function calls

您可以指定包含数值、文本、日期时间、类别或 bin 数据的分组变量。

扩展功能

版本历史记录

在 R2015b 中推出