3

患者がいくつかの変数に対して複数の(そして未知の)値を持つことができ、最終的に次のようになるデータセットがあります。

    ID   Var1   Var2   Var3   Var4
    1    Blue   Female 17     908
    1    Blue   Female 17     909
    1    Red    Female 17     910
    1    Red    Female 17     911
...
    99   Blue   Female 14     908
    100  Red    Male   28     911

このデータをパックして、各IDにエントリが1つだけになるようにし、元の多数のエントリに値の1つが存在するかどうかを示すインジケーターを付けます。したがって、たとえば、次のようなものです。

ID   YesBlue   Var2      Var3   Yes911
1    1         Female    17     1
99   1         Female    14     0
100  0         Male      28     1

SASでこれを行う簡単な方法はありますか?または、それが失敗した場合、Access(データの取得元)では、実際の使用方法がわかりません。

4

4 に答える 4

3

データセットの名前が PATIENTS1 の場合、おそらく次のようになります。

proc sql noprint;
  create table patients2 as
  select *
        ,case(var1)
           when "Blue" then 1
           else 0
         end as ablue
        ,case(var4)
           when 911 then 1
           else 0
         end as a911
        ,max(calculated ablue) as yesblue
        ,max(calculated a911) as yes911
  from patients1
  group by id
  order by id;
quit;

proc sort data=patients2 out=patients3(drop=var1 var4 ablue a911) nodupkey;
  by id;
run;
于 2013-01-09T09:32:17.450 に答える
2

これがデータステップソリューションです。Var2 と Var3 の値は、特定の ID に対して常に同じであると想定しています。

data have;
input ID Var1 $ Var2 $ Var3 Var4;
cards;
1    Blue   Female 17     908
1    Blue   Female 17     909
1    Red    Female 17     910
1    Red    Female 17     911
99   Blue   Female 14     908
100  Red    Male   28     911
;
run;

data want (drop=Var1 Var4 _:);
set have;
by ID;
if first.ID then do;
    _blue=0;
    _911=0;
end;
_blue+(Var1='Blue');
_911+(Var4=911);
if last.ID then do;
    YesBlue=(_blue>0);
    Yes911=(_911>0);
    output;
end;
run;
于 2013-01-09T09:39:55.060 に答える
1

編集: キースが言ったことと同じように見えますが、書き方が違うだけです。

これはそれを行う必要があります:

data test;
input id Var1 $ Var2 $ Var3 Var4;
datalines;
1    Blue   Female 17     908
1    Blue   Female 17     909
1    Red    Female 17     910
1    Red    Female 17     911
99   Blue   Female 14     908
100  Red    Male   28     911
run;

data flatten(drop=Var1 Var4);
set test;
retain YesBlue;
retain Yes911;
by id;

if first.id then do;
  YesBlue = 0;
  Yes911 = 0;
end;

if Var1 eq "Blue" then YesBlue = 1;
if Var4 eq 911 then Yes911 = 1;

if last.id then output;
run;
于 2013-01-09T09:44:50.427 に答える
1

PROC SQLはこのようなものに最適です。これは DavB の回答に似ていますが、追加の並べ替えを排除します。

data have;
input ID Var1 $ Var2 $ Var3 Var4;
cards;
1    Blue   Female 17     908
1    Blue   Female 17     909
1    Red    Female 17     910
1    Red    Female 17     911
99   Blue   Female 14     908
100  Red    Male   28     911
;
run;

proc sql;
  create table want as
  select ID
       , max(case(var1)
               when 'Blue'
               then 1
               else 0 end) as YesBlue
       , max(var2)         as Var2
       , max(var3)         as Var3
       , max(case(var4)
               when 911
               then 1
               else 0 end) as Yes911
  from have
  group by id
  order by id;
quit;

また、元のデータを ID 変数によって安全に減らしますが、ソースが記述どおりではない場合、エラーが発生する可能性があります。

于 2013-01-09T14:14:58.167 に答える