exponenta event banner

splitapply

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

Описание

пример

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

splitapply объединяет два шага в рабочем процессе Split-Apply-Combine.

пример

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

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

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

Подробнее

свернуть все

Разделение-применение-комбинирование рабочего процесса

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

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

Представлен в R2015b