SASを使用した可変外観の数に基づいてダミー変数を作成する
-
20-12-2019 - |
質問
IDの数を示すためにダミー変数Aを作成しようとしています。IDが正確に2回表示されている場合、0は0です。IDが2回以上表示されている場合は、等しい1です。
私の希望の出力は次のとおりです。
ID YEAR A
1078 1989 0
1078 1999 0
1161 1969 0
1161 2002 0
1230 1995 0
1230 2002 0
1279 1996 0
1279 2003 0
1447 1993 0
1447 2001 0
1487 1967 1
1487 2008 1
1487 2009 1
1678 1979 0
1678 2002 0
.
マイコードは次のとおりです。
data new data;
set data;
by ID YEAR;
if First.ID then count=0;
count+1;
run;
data newdata;
set newdata;
by ID YEAR count;
if sum(count)=3 then A=0;
if sum(count)>3 then A=1;
run;
.
しかし出力は正しくありません。
解決
複数の観察にまたがって数を合計するには、合計(数)を使用することはできません。代わりに、最初に観測値を数える必要があり、カウントを元のデータにマージする必要があります。
データステップソリューション
data newdata;
set data;
by ID YEAR;
if First.ID then count=0;
count+1;
if last.id then output;
drop year;
run;
.
if last.id then output
は、NewDataが各IDの最後の観測しか持たないことを意味します。最後の観察にはIDごとの観測数の郡があるため、
このステップは、元のデータ「データ」を「NewData」からのカウントでマージして計算します。
data newdata2;
merge data newdata;
by ID;
if count=2 then A=0;
if count>2 then A=1;
drop count;
run;
.
Proc SQLソリューション Proc SQLでさらに素早くできる:
proc sql;
create table newdata as
select id, year, (case when count(*) = 2 then 0 else 1 end) as a
from data
group by id;
quit;
.
group by id
とは、count()などの要約統計をIDで計算することを意味します。したがって、count(*)
は各IDの観測値を数えます。(case when count(*) = 2 then 0 else 1 end) as a
変数aを作成します。与えられたIDのカウントが2の場合、Aは0の値を取りますが、それ以外の場合は1の値を取ります。
所属していません StackOverflow