(注:これは私が正解を持っている宿題ですが、結果には満足していません。)
データに関する少しのコンテキスト。患者が診療所を訪れたときの 4 つの薬のそれぞれに関する情報が記録されました。コード 0 は薬が服用されていないことを示し、コード 1 は薬が開始されていることを示し、コード 2 は薬が服用されていることを示します。製造中止。診察ごとに、患者 ID、診察日、および 4 つの薬剤のステータス コードが記録されます。
私の目標は、手順のみを使用PROC SORT
しDATA _NULL_
てレポートを作成することです。PUT
すべての処方薬を使用した個人のリストを作成するステップでステートメントを使用して成功しましたDATA _NULL_
が、すべての処方薬を使用した個人の総数を示すレポートを作成するにはどうすればよいですか?
電流出力
患者 01 は 4 つの異なる薬を服用し
ました 患者 03 は 4 つの異なる薬を服用し
ました 患者 04 は 4 つの異なる薬を服用しました
望ましい出力
4 つの異なる薬を服用している 3 人の患者がいます。
コード
DATA drug;
Input ID : $2. Visit : MMDDYY8. rx_1-rx_4;
Datalines;
04 01/28/95 1 0 1 1
03 02/28/95 2 0 2 1
05 05/20/95 0 0 0 0
01 03/27/95 1 0 0 1
03 03/02/95 0 0 0 1
01 04/04/95 0 1 1 1
02 04/29/95 0 1 1 1
02 05/04/95 0 0 1 0
03 02/26/95 1 0 1 1
03 03/06/95 0 1 0 1
04 01/25/95 0 0 1 0
05 03/01/95 0 0 0 0
02 04/30/95 0 2 1 2
01 03/31/95 2 1 0 1
03 03/07/95 0 1 0 2
04 02/01/95 1 1 1 1
05 04/18/95 0 0 0 0
01 04/09/95 0 2 1 2
;
PROC SORT Data = Drug;
By id visit;
RUN;
%let num_rx_var = %eval(4);
DATA _null_;
File Print;
Set drug;
By id;
Array
rx_indicator{&num_rx_var} rx_1-rx_4;
Array
takes_rx_{&num_rx_var} (&num_rx_var*0);
Array
has_taken_rx_{&num_rx_var} (&num_rx_var*0);
Do i=1 To &num_rx_var;
takes_rx_{i} = 0;
End;
Do i=1 To &num_rx_var;
takes_rx_{i} = takes_rx_{i} or (rx_indicator{i}>0);
sum_dif_rx_visit = sum(of takes_rx_{*});
End;
If first.id Then
Do i=1 To &num_rx_var;
has_taken_rx_{i} = 0;
End;
Do i=1 To &num_rx_var;
has_taken_rx_{i} = has_taken_rx_{i} or (rx_indicator{i}>0);
End;
If last.id Then Do;
num_diff_rx = sum(of has_taken_rx_{*});
End;
all_drugs = count(num_diff_rx, &num_rx_var);
If all_drugs = 1 Then Put "Patient " id "has taken " num_diff_rx "different drugs" ;
RUN;