主要内容

splitapply

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

说明

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

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

输出 Y 和组编号 G 具有相同的排序。

如果 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 中的变量分为若干组,应用 func,并以数组形式返回 Ysplitapply 函数将 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
     1
     1
     1
     2
     1
      ⋮

显示患者的体重。

Weight
Weight = 100×1

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

使用 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             15808  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 的行还是列视为数据变量。

组编号,指定为由正整数组成的向量。对于由组编号指定的 N 个组,在 1N 之间的每个整数必须在 G 中至少出现一次。

如果 G 的任何元素是 NaN,则 splitapply 在将 X 拆分成若干组时会省略 X 中的对应值。要包含这些值,请考虑改用 groupsummary 函数。

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

  • 如果 X 是矩阵且 G 是行向量,则 G 的长度必须等于 X 的列数。

  • 如果 X 是矩阵且 G 是列向量,则 G 的长度必须等于 X 的行数。

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

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

详细信息

全部折叠

扩展功能

全部展开

版本历史记录

在 R2015b 中推出