포스팅 목차
o MODE 함수
목 적 :
MODE 함수는 데이터 집합에서 빈도수가 가장 높은 최빈값을 반환한다.
문 법
- 엑 셀 : MODE(number1,[number2],...) - SAS : 1) 변수 처리 - PROC UNIVARIATE, PROC SQL 2) 관측치 처리 - 배열, HASH Object, 전치 후 변수 처리, Proc Iml 방식 등 |
범 주 : 호환성 함수
관련 함수
함수명 | 함수내용 |
AGGREGATE | 목록 또는 데이터베이스에서 집계 값을 반환한다. |
AVERAGE | 인수 리스트의 산술 평균을 반환한다. |
COUNT | 지정한 인수 목록에서 숫자의 개수를 카운트한다. |
COUNTA | 인수 목록에서 공백이 아닌 셀의 개수를 카운트한다. |
COUNTIF |
범위 내에서 주어진 조건과 동일한 셀의 개수를 계산한다. |
LARGE | 사용자가 지정한 데이터 집합에서 k번째로 큰 값을 반환한다. |
MAX | 인수 목록에서 최대값을 반환한다. |
MEDIAN | 주어진 수치 인수 목록에서 중앙값을 반환한다. |
MIN | 사용자가 지정한 인수 목록에서 최솟값을 반환한다. |
MODE | 데이터 집합에서 빈도수가 가장 높은 최빈값을 반환한다. |
MODE.MULT | 배열이나 데이터 범위에서 빈도수가 가장 높은 값의 세로 배열을 반환한다. |
MODE.SNGL | 데이터 집합에서 빈도수가 가장 높은 최빈값을 반환한다. |
SMALL | 데이터 집합에서 첫 번째 인수에서 지정한 k번째로 작은 값을 반환한다. |
예 제
[ 변수 기준 처리]
다음 예제는 PROC UNIVARIATE와 PROC SQL을 사용하여서 데이터 리스트에서 가장 많이 존재하는 최빈값을 반환한다.
SAS Program |
DATA MODE;
INPUT VAR;
CARDS;
5.6
4
4
3
2
4
;
* PROC UNIVARIDTE를 사용하여서 최빈값을 계산;
SAS Program |
PROC UNIVARIATE DATA=MODE;
VAR VAR;
RUN;
Results |
* PROC SQL의 HAVING 절을 사용하여서 최빈값을 계산;
SAS Program |
PROC SQL;
CREATE TABLE MODE AS
SELECT *
FROM ( SELECT VAR,
COUNT(*) AS VAL_CNT
FROM MODE
GROUP BY 1 )
HAVING VAL_CNT=MAX(VAL_CNT);
QUIT;
Results |
OBS VAR VAL_CNT
1 4 3
[ 관측치 처리]
* Mode 함수를 제공하지 않는 관계로 일반적으로는 배열, Hash Object, 전치 후 통계 프로시져 등의 방법으로 최빈값을 구할 수 있고, 아래는 Proc iml의 freq함수와 level함수를 사용하여서 행 단위의 최빈값 계산하여 원 데이터에 결합하는 방식으로 구현.
SAS Program |
data have;
infile cards expandtabs;
input Chrom Pos ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8;
cards;
1 8456 0 0 0 0 0 . 1 1
1 9948 0 0 2 . 1 2 2 2
1 10058 1 1 1 1 1 1 . 1
2 6535 0 . 0 0 0 0 1 1
2 8967 1 1 0 1 1 1 0 .
2 10234 1 1 1 0 0 1 1 1
3 1023 0 0 1 2 0 0 0 0
3 9978 1 2 0 . 2 2 2 2
3 15032 0 0 0 1 1 2 1 1
;
run;
- 테이블 처리 방식
SAS Programming |
proc iml;
CREATE Temp_table VAR{ ROW_MODE};
use have(keep=ID:);
read all var _all_ into x[c=vname];
close;
do i=1 to nrow(x);
row=x[i,];
call tabulate(level,freq,row);
ROW_MODE=level[freq[<:>]];
APPEND;
end;
close Temp_table;
* 일단 Temp_table 생성 후 처리;
Temp_table = TableCreateFromDataSet("work", "Temp_table");
row_mode = TableGetVarData(Temp_table, "ROW_MODE");
* have 테이블을 행렬로 생성;
have_table = TableCreateFromDataSet("work", "have");
* 행렬에 변수 추가;
call TableAddVar(have_table, "row_mode", row_mode);
* 테이블을 SAS 테이블로 변경;
call TableWriteToDataSet(have_table, "work", "mode_table");
quit;
Results |
OBS Chrom Pos ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8 row_mode
1 1 8456 0 0 0 0 0 . 1 1 0
2 1 9948 0 0 2 . 1 2 2 2 2
3 1 10058 1 1 1 1 1 1 . 1 1
4 2 6535 0 . 0 0 0 0 1 1 0
5 2 8967 1 1 0 1 1 1 0 . 1
6 2 10234 1 1 1 0 0 1 1 1 1
7 3 1023 0 0 1 2 0 0 0 0 0
8 3 9978 1 2 0 . 2 2 2 2 2
9 3 15032 0 0 0 1 1 2 1 1 1
- Merge 함수로 빈도값 추가하기
SAS Programming |
proc iml;
CREATE Temp_table VAR{ ROW_MODE};
use have(keep=ID:);
read all var _all_ into x[c=vname];
close;
do i=1 to nrow(x);
row=x[i,];
call tabulate(level,freq,row);
ROW_MODE=level[freq[<:>]];
APPEND;
end;
quit;
data new_table;
merge have Temp_table;
run;
Results |
OBS Chrom Pos ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8 ROW_MODE
1 1 8456 0 0 0 0 0 . 1 1 0
2 1 9948 0 0 2 . 1 2 2 2 2
3 1 10058 1 1 1 1 1 1 . 1 1
4 2 6535 0 . 0 0 0 0 1 1 0
5 2 8967 1 1 0 1 1 1 0 . 1
6 2 10234 1 1 1 0 0 1 1 1 1
7 3 1023 0 0 1 2 0 0 0 0 0
8 3 9978 1 2 0 . 2 2 2 2 2
9 3 15032 0 0 0 1 1 2 1 1 1
--------------------------------------------
엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크 |
SAS 함수(SAS Function) 리스트 링크 |
반응형
'통계프로그램 비교 시리즈 > 엑셀과 SAS 함수' 카테고리의 다른 글
【엑셀(Excel)과 SAS함수】 MODE.SNGL 함수 (0) | 2021.09.23 |
---|---|
【엑셀(Excel)과 SAS함수】 MODE.MULT 함수 (0) | 2021.09.23 |
【엑셀(Excel)과 SAS함수】 MOD 함수 (0) | 2021.09.23 |
【엑셀(Excel)과 SAS함수】 MMULT 함수 (0) | 2021.09.23 |
【엑셀(Excel)과 SAS함수】 MIRR 함수 (0) | 2021.09.23 |
댓글