splitapply

Разделите данные в группы и примените функцию

Синтаксис

Y = splitapply(func,X,G)
Y = splitapply(func,X1,...,XN,G)
Y = splitapply(func,T,G)
[Y1,...,YM] = splitapply(___)

Описание

пример

Y = splitapply(func,X,G) разделения X в группы, заданные G и, применяют функциональный func к каждой группе. splitapply возвращает Y как массив, который содержит конкатенированные выходные параметры от func для разделения групп из X. G входного параметра является вектором положительных целых чисел, который задает группы, которым принадлежат соответствующие элементы X. Если G содержит значения NaN, splitapply не использует соответствующие значения в X, когда это разделяет X в группы. Чтобы создать G, можно использовать функцию findgroups.

splitapply комбинирует два шага в рабочем процессе "Разделение-Применение-Объединение".

пример

Y = splitapply(func,X1,...,XN,G) разделения X1,...,XN в группы и применяют func. Вызовы функции splitapply func однажды на группу, с соответствующими элементами от X1,...,XN как входные параметры N к func.

пример

Y = splitapply(func,T,G) переменные разделений таблицы T в группы и применяют func. Функция splitapply обрабатывает переменные T как векторы, матрицы или массивы ячеек, в зависимости от типов данных табличных переменных. Если T имеет переменные N, то func должен принять входные параметры N.

пример

[Y1,...,YM] = splitapply(___) переменные разделений в группы и применяют func к каждой группе. func возвращает несколько выходных аргументов. Y1,...,YM содержит конкатенированные выходные параметры от func для разделения групп из переменных входных данных. func может возвратить выходные аргументы, которые принадлежат различным классам, но класс каждого вывода должен быть тем же каждым разом, когда func называется. Можно использовать этот синтаксис с любым из входных параметров предыдущих синтаксисов.

Количество выходных аргументов от func не должно совпадать с количеством входных параметров, заданных X1,...,XN.

Примеры

свернуть все

Вычислите средние высоты полом для групп пациентов и отобразите результаты.

Загрузите терпеливые высоты и полы из файла данных patients.mat.

load patients
whos Gender Height
  Name          Size            Bytes  Class     Attributes

  Gender      100x1             12212  cell                
  Height      100x1               800  double              

Задайте группы полом с findgroups.

G = findgroups(Gender);

Разделите Height в группы, заданные G. Вычислить среднюю высоту по полу. Первая строка выходного аргумента является средней высотой пациенток, и вторая строка является средней высотой штекерных пациентов.

splitapply(@mean,Height,G)
ans = 2×1

   65.1509
   69.2340

Вычислите отклонения различий в показаниях кровяного давления для групп пациентов и отобразите результаты. Показания кровяного давления содержатся в двух переменных данных. Чтобы вычислить различия, используйте функцию, которая берет два входных параметра.

Загрузите показания кровяного давления и курение данных для 100 пациентов из файла данных patients.mat.

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

Используйте findgroups и splitapply, чтобы разделить данные о пациентах в группы и вычислить отклонения различий. findgroups также возвращает идентификаторы группы в smokers. Вызовы функции splitapply func однажды на группу, с Systolic и Diastolic как эти два входных параметра.

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

Загрузите терпеливые веса, полы и состояние как курильщики от patients.mat.

load patients
whos Weight Gender Smoker
  Name          Size            Bytes  Class      Attributes

  Gender      100x1             12212  cell                 
  Smoker      100x1               100  logical              
  Weight      100x1               800  double               

Используйте findgroups и splitapply, чтобы разделить терпеливые веса в группы и вычислить статистику для каждой группы.

G = findgroups(Gender,Smoker);
Y = splitapply(mystats,Weight,G)
Y = 4×3

  111.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) из таблиц данных о пациентах. Сгруппируйте пациентов полом и состоянием как курильщики или некурящие.

Загрузите данные о пациентах и группирующие переменные в таблицы.

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

Задайте функцию, которая вычисляет средний BMI от весов и высот групп или пациентов.

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

Составьте таблицу, которая содержит средний BMI для каждой группы.

[G,results] = findgroups(GT);
meanBMI = splitapply(meanBMIFcn,DT,G);
results.meanBMI = meanBMI
results=4×3 table
     Gender     Smoker    meanBMI
    ________    ______    _______

    'Female'    false     21.672 
    'Female'    true      21.669 
    'Male'      false     26.578 
    'Male'      true      26.458 

Вычислите минимум, среднее значение и максимальные высоты для групп пациентов и возвратите результаты в таблице.

Задайте функцию в файле с именем multiStats.m, который принимает входной вектор и возвращает минимум, среднее значение и максимальные значения вектора.

% Copyright 2015 The MathWorks, Inc.

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

Загрузите данные о пациентах в таблицу.

load patients
T = table(Gender,Height);
summary(T)
Variables:

    Gender: 100x1 cell array of character vectors

    Height: 100x1 double

        Values:

            Min          60   
            Median       67   
            Max          72   

Высоты пациента группы полом. Составьте таблицу, которая содержит выходные параметры от multiStats для каждой группы.

[G,gender] = findgroups(T.Gender);
[minHeight,meanHeight,maxHeight] = splitapply(@multiStats,T.Height,G);
result = table(gender,minHeight,meanHeight,maxHeight)
result =

  2x4 table

     gender     minHeight    meanHeight    maxHeight
    ________    _________    __________    _________

    'Female'       60          65.151         70    
    'Male'         66          69.234         72    

Входные параметры

свернуть все

Функция, чтобы примениться к группам данных, заданных как указатель на функцию.

Если 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 обрабатывает каждую табличную переменную как отдельную переменную данных.

Больше о

свернуть все

Рабочий процесс "разделение применяет объединение

Рабочий процесс "Разделение-Применение-Объединение" распространен в анализе данных. В этом рабочем процессе аналитик разделяет данные в группы, применяет функцию к каждой группе и комбинирует результаты. Схема показывает типичный пример рабочего процесса и части рабочего процесса, реализованного findgroups и splitapply.

Расширенные возможности

Введенный в R2015b