이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

splitapply

데이터를 그룹으로 분할하고 함수 적용

설명

예제

Y = splitapply(func,X,G)XG에서 지정한 그룹으로 분할하고 함수 func를 각 그룹에 적용합니다. splitapplyYX에서 분할된 그룹에 func를 적용하여 생성한 출력값을 결합하는 배열로 반환합니다. 입력 인수 GX의 대응하는 요소가 속하는 그룹을 지정하는 양의 정수로 구성된 벡터입니다. GNaN 값이 포함되는 경우 splitapplyX를 그룹으로 분할할 때 X에서 대응하는 값을 생략시킵니다. G를 생성하려면, findgroups 함수를 사용할 수 있습니다.

splitapply분할-적용-재조합 워크플로(Split-Apply-Combine Workflow)에서 두 단계를 결합합니다.

예제

Y = splitapply(func,X1,...,XN,G)X1,...,XN을 그룹으로 분할하고 func 함수를 적용합니다. splitapply 함수는 X1,...,XN에서 대응하는 요소를 func에 대한 N개의 입력 인수로 하여 그룹당 한 번씩 func를 호출합니다.

예제

Y = splitapply(func,T,G)는 테이블 T의 변수를 그룹으로 분할하고 func을 적용합니다. splitapply 함수는 테이블 변수의 데이터형에 따라, T의 변수를 벡터, 행렬, 셀형 배열 중 하나로 취급합니다. TN개 변수가 있는 경우 funcN개 입력 인수를 허용합니다.

예제

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

HeightG에서 지정한 그룹으로 분할합니다. 성별 평균 키를 계산합니다. 출력 인수의 첫 번째 행은 여성 환자의 평균 키이고, 두 번째 행은 남성 환자의 평균 키입니다.

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

   65.1509
   69.2340

환자 그룹에 대한 혈압 기록의 차이 분산값을 계산하고 결과를 표시합니다. 혈압 기록은 두 개의 데이터 변수에 포함됩니다. 차이를 계산하려면 두 개의 입력 인수를 받는 함수를 사용하십시오.

데이터 파일 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에는 입력 인수 2개가 필요합니다.

func = @(x,y) var(x-y);

findgroupssplitapply를 사용하여 환자 데이터를 그룹으로 분할하고 차이의 분산을 계산합니다. 또한 findgroupssmokers로 그룹 식별자를 반환합니다. splitapply 함수는 그룹 당 한 번, funcSystolicDiastolic을 두 개의 입력 인수로 하여 호출합니다.

[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               

findgroupssplitapply를 사용하여 환자의 몸무게를 여러 그룹으로 분할하고 각 그룹에 대한 통계량을 계산합니다.

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이 비 스칼라 출력 인수를 반환하는 경우, splitapplyfunc에 대한 연속 호출에서 얻은 출력 인수를 결합할 수 있도록 인수의 방향이 지정되어야 합니다 . 예를 들어, 입력 데이터 변수가 열 벡터인 경우, func은 스칼라나 행 벡터를 출력 인수로 반환해야 합니다.

예: Y = splitapply(@sum,X,G)X에 있는 데이터 그룹의 합계를 반환합니다.

데이터 변수로, 벡터, 행렬 또는 셀형 배열로 지정됩니다. X의 요소는 G의 대응하는 요소에서 지정하는 그룹에 속합니다.

X가 행렬인 경우 splitapply는 각 행이나 열을 개별 데이터 변수로 취급합니다. G의 방향은 splitapplyX의 행을 데이터 변수로 취급하는지, 아니면 X의 열을 데이터 변수로 취급하는지를 결정합니다.

그룹 번호로, 양의 정수의 벡터로 지정됩니다.

  • X가 벡터나 셀형 배열인 경우 GX와 길이가 같아야 합니다.

  • X가 행렬인 경우, G의 길이는 G의 방향에 따라 X의 행 개수 또는 열 개수와 같아야 합니다.

  • 입력 인수가 테이블 T인 경우 G는 열 벡터여야 합니다. G의 길이는 T의 행 개수와 같아야 합니다.

데이터 변수로, 테이블로 지정됩니다. splitapply는 각 테이블 변수를 별도의 데이터 변수로 취급합니다.

세부 정보

모두 축소

분할-적용-재조합 워크플로(Split-Apply-Combine Workflow)

분할-적용-재조합 워크플로는 데이터 분석에 일반적으로 사용됩니다. 이 워크플로에서 분석가는 데이터를 여러 그룹으로 분할하고 각 그룹에 함수를 적용한 후 그 결과를 결합합니다. 다음 도식은 이 워크플로의 일반적인 예를 제시하고 findgroupssplitapply로 구현되는 워크플로의 일부를 보여 줍니다.

확장 기능

R2015b에 개발됨