SASを使用した可変外観の数に基づいてダミー変数を作成する

StackOverflow https://stackoverflow.com//questions/25004053

  •  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の値を取ります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top