假設我們有一些數據集people
,其中包含4級(1,2,3,4)的分類變量income
。我們如何在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;
換句話說,這將創建三個虛擬變量的四個級別。這是正確的嗎?
假設我們有一些數據集people
,其中包含4級(1,2,3,4)的分類變量income
。我們如何在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;
換句話說,這將創建三個虛擬變量的四個級別。這是正確的嗎?
我修改了下面的代碼。這會給出一個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;
更靈活的方法是使用數組。
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;
而且我會寫更一般的東西。
%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);
你不需要寫「else」。下面還將努力:
income1_ind=(income1 eq 1);
income2_ind=(income2 eq 2);
代碼: -
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。
您必須在else語句之前的行後添加分號。 – Damien
謝謝@Damien。 – forecaster