2014-01-30 5 views
4

people의 데이터 집합에의 4 개 수준 (1,2,3,4)이있는 범주 형 변수가 있다고 가정합니다. SAS에서 어떻게 코딩합니까? 그것은 :SAS의 더미 변수

data people; 
set people; 
if income=1 then income1=1; 
else if income=2 then income2=1 
else if income =3 then income3=1; 
run; 

즉, 이것은 4 개의 레벨에 대해 3 개의 더미 변수를 생성합니다. 이게 옳은 거니?

답변

1

아래 코드를 수정했습니다. 이것은 3 개의 더미 코딩 된 변수를 제공합니다. income = 4이 참조 코드가됩니다.

data people_dummy; 
     set people; 
     if income=1 then income1=1 ; else income1=0; 
     if income=2 then income2=1 ; else income2=0; 
     if income=3 then income3=1 ; else income3=0; 
run; 
+0

else 문 앞에 줄 다음에 세미콜론을 추가해야합니다. 덕분에 @ – Damien

+0

감사합니다. – forecaster

5

다소 유연한 방법은 배열을 사용하는 것입니다.

data people; 
set people; 
array incomes income1-income4; 
do _t = 1 to dim(incomes); 
    if income=_t then income[_t] = 1; 
    else if not missing(income) then income[_t]=0; 
    else income[_t]=.; 
end; 
run; 
1

그리고 나는 좀 더 일반적인 것을 쓸 것입니다.

%macro cat(indata, variable); 
    proc sql noprint; 
    select distinct &variable. into :mvals separated by '|' 
    from &indata.; 

    %let mdim=&sqlobs; 
    quit; 

    data &indata.; 
    set &indata.; 
    %do _i=1 %to &mdim.; 
     %let _v = %scan(&mvals., &_i., |); 
     if &variable. = &_v. then &variable.&_v. = 1; else &variable.&_v = 0; 
    %end; 
    run; 
%mend; 

%cat(people, income); 
1

"else"라고 쓸 필요는 없습니다. 다음은 또한 작동합니다

income1_ind=(income1 eq 1); 
    income2_ind=(income2 eq 2); 
0

코드 : -

proc sql noprint; 
select distinct 'income' || strip(put(income,8.)) into :income_var separated by ' ' 
from people; 
quit; 

data people(rename = (in = income)); 
set people(rename = (income = in)); 
length &income_var. 8; 
array tmp_arr(*) income:; 
do i = 1 to dim(tmp_arr); 
    if in eq i then tmp_arr(i) = 1; 
    else tmp_arr(i) = 0; 
end; 
drop i; 
run; 

작업 : 위 SAS 코드는 동적이며 자동에 따라 변수의 수를 생성하기 때문에, 소득 변수의 수준의 수를 작동합니다 입력 된 사람 데이터 세트의 고유 한 레벨 수.

소득 단계 값에 따라 데이터 단계에서 각 변수를 값 1로 설정하고 다른 변수는 0으로 설정합니다.