1

(注:これは私が正解を持っている宿題ですが、結果には満足していません。)

データに関する少しのコンテキスト。患者が診療所を訪れたときの 4 つの薬のそれぞれに関する情報が記録されました。コード 0 は薬が服用されていないことを示し、コード 1 は薬が開始されていることを示し、コード 2 は薬が服用されていることを示します。製造中止。診察ごとに、患者 ID、診察日、および 4 つの薬剤のステータス コードが記録されます。

私の目標は、手順のみを使用PROC SORTDATA _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;
4

1 に答える 1

1

これが私が行う方法です。主にあなたがやっている方法に固執しようとしています。

本当に必要のない余分なものがたくさんあります。COUNTたとえば最後に(文字関数)を使用している理由がわかりません。%eval()また、マクロ変数で使用している理由もわかりません-それは何もしていません。配列が何をしているのかわかりませんtakes- それは何か他のものですか?

全体として、あなたのアプローチはかなり健全です。データがより適切に構造化されていれば、 if was 代わりにupdateステートメントを使用すると、これは非常に簡単になります。ここの重要性がよくわかりません。あなたはそれを無視しているようです。ある時点で必要な薬もあるということは理にかなっていますが、誰が知っていますか.0.221

すべての薬を服用している患者の総数を調べる一般的な方法は、カウンター変数を最後if(すべての薬が服用されていることを確認する場所) に追加し、それを出力で使用することです。 x+1;カウンターを作成し、自動的に保持します。

%let num_rx_var = 4; 
DATA test;
    File Print;
    Set drug end=eof;                    *note small change here - sets `eof=1` on last row.;
    By id;
    array rx rx_1-rx_&num_rx_var;
    array rx_flag[&num_rx_var] _temporary_;  
                                         *Temporary array variables are automatically retained;
    if first.id then 
        call missing(of rx_flag[*]);     *clear the flags for a new ID;
    do _i = 1 to dim(rx);                *use your OR construct, that is fine;   
        rx_flag[_i] = rx_flag[_i] or rx[_i];
    end;
    if last.id then do;                  
        sum_drugs = sum(of rx_flag[*]);  *check if the sum of the flags equals number of flags;
                                         *there is a more fun way to do this using `whichn`;
        if sum_drugs = dim(rx_flag) then do;
            num_total +1;                *increment our counter;
            put "Patient " id "has taken "  sum_drugs "different drugs.";
        end;
    end;
    if eof then                         /* Use our counter only on the last row of the dataset */
        put num_total "Patients have taken &num_rx_Var. different drugs.";
RUN;
于 2014-10-29T20:26:51.660 に答える