포스팅 목차
* Mode 함수를 제공하지 않는 관계로 일반적으로는 배열, Hash Object, 전치 후 통계 프로시져 등의 방법으로 최빈값을 구할 수 있고, 아래는 Proc iml의 freq함수와 level함수를 사용하여서 행 단위의 최빈값 계산하여 원 데이터에 결합하는 방식으로 구현.
* 질문 : https://cafe.daum.net/statsas/B3m/15467
* [엑셀과 SAS함수] MODE 함수 : https://statwith.tistory.com/2433
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
반응형
'SAS > SAS Tip's' 카테고리의 다른 글
[SAS] 그룹별 동일 항목으로 구성된 관측치 추출하기 (0) | 2022.12.28 |
---|---|
[DB 로딩 에러 방지] 오라클 DB 건수 체크 후 데이터 로딩 (0) | 2021.12.03 |
[데이터 결합] Data Step에서의 카테시안 곱(Cartesian product) 구현하기 (0) | 2021.11.16 |
[변수출력] 다양한 변수 리스트 출력 방식; (0) | 2021.11.15 |
[자원관리] 라이브러리에서 임시(TEMP) 데이터 세트 지우기 (0) | 2021.11.04 |
댓글