Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

splitapply

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

설명

데이터를 그룹으로 분할하고 이 그룹에 함수를 적용하려면 findgroups 함수와 splitapply 함수를 함께 사용하십시오. 데이터 그룹 계산에 대한 자세한 내용은 데이터 그룹에 대한 계산 항목을 참조하십시오.

예제

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

G를 만들려면 먼저 findgroups 함수를 사용하십시오. 그런 다음 splitapply를 사용합니다.

예제

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

환자의 체중을 표시합니다.

Weight
Weight = 100×1

   176
   163
   131
   133
   119
   142
   142
   180
   183
   132
      ⋮

G를 사용하여 Weight 배열을 두 개의 체중 그룹으로 분할합니다. 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에는 입력 인수 2개가 필요합니다.

func = @(x,y) var(x-y)
func = function_handle with value:
    @(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)]
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             14208  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에서 환자 데이터와 그룹화 변수를 테이블에 불러옵니다. (병원 위치를 string형 배열로 변환합니다.)

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는 입력 배열에서 최솟값, 평균값, 최댓값을 3개의 출력으로 반환합니다. 흡연자와 비흡연자에 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이 비 스칼라 출력 인수를 반환하는 경우, 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는 각 테이블 변수를 별도의 데이터 변수로 취급합니다.

세부 정보

모두 축소

데이터 그룹에 대한 계산

데이터 분석에서는 일반적으로 데이터 그룹에 대한 계산을 수행합니다. 이러한 계산의 경우 하나 이상의 데이터 변수를 데이터 그룹으로 분할하고, 각 그룹에 대해 계산을 수행하고, 결과를 하나 이상의 출력 변수로 조합합니다. 하나 이상의 그룹화 변수를 사용하여 그룹을 지정할 수 있습니다. 그룹화 변수의 고유 값은 데이터 변수의 대응값이 속하는 그룹을 정의합니다.

예를 들어, 다음 도식은 6×1 숫자형 벡터를 두 개의 데이터 그룹으로 분할하고 각 그룹의 평균을 계산한 다음 출력값을 2×1 숫자형 벡터로 조합하는 그룹화된 간단한 계산을 보여줍니다. 6×1 그룹화 변수에는 두 개의 고유한 값 ABXYZ가 있습니다.

Calculation that splits a data variable based on a grouping variable, performs calculations on individual groups of data by applying the same function, and then concatenates the outputs of those function calls

숫자, 텍스트, 날짜/시간, 범주 또는 Bin이 포함된 그룹화 변수를 지정할 수 있습니다.

확장 기능

버전 내역

R2015b에 개발됨