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. The splitapply вызовы функций func один раз в группу с соответствующими элементами из X1,...,XN как N входные параметры в func.

пример

Y = splitapply(func,T,G) разделяет переменные таблицы T в группы и применяется func. The 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             11412  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. The 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             11412  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 содержит статистику для другой группы пациентов.

Вычислите средний индекс массы тела (ИМТ) из таблиц данных о пациентах. Сгруппировать пациентов по полу и статусу курильщиков или некурящих.

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

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

Определите функцию, которая вычисляет средний ИМТ из весов и высот групп или пациентов.

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

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

[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.

  • Если входной параметр является table T, затем G должен быть вектор-столбец. Длина G должно быть равно количеству строк T.

Переменные данных, заданные как таблица. splitapply обрабатывает каждую табличную переменную как отдельную переменную данных.

Подробнее о

свернуть все

Рабочий процесс «Разделение-Применение-Объединение»

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

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

Введенный в R2015b