2

PROC REPORT を使用して 2 つのフィールドを比較し、結果を 3 番目の計算フィールドに格納しています。私のフィールドのいくつかは数値で、いくつかは文字です。比較するフィールドを表示したくないので、結果だけを表示したいのでNOPRINT、フィールドを定義するときにオプションを適用しました。

文字フィールドは問題なく機能しますが、数値フィールドで並べ替えやグループ化を行わないと、欠損値が返されます。問題を説明するための SSCCE を次に示します。

(以下の例は非常に単純化されていることに注意してください。実際のコードはかなり複雑です。回避策ではなく、標準的な回答を期待しています。)

サンプルデータ

DATA Work.Example;

    INFILE  DATALINES
            DELIMITER = ','
            ;

    INPUT   N1
            N2
            C1      $
            C2      $
            ;

DATALINES;
2,1,A,B
1,2,G,S
2,6,J,P
3,9,L,Q
5,3,X,T
5,8,X,E
4,0,T,S
5,7,K,W
;
RUN;

結果:

N1  N2  C1  C2
 2   1   A   B
 1   2   G   S
 2   6   J   P
 3   9   L   Q
 5   3   X   T
 5   8   X   E
 4   0   T   S
 5   7   K   W

手続き報告書

PROC REPORT DATA=Work.Example;

    COLUMNS     N1
                N2
                ID_N
                C1
                C2
                NAME
                ;

    DEFINE      N1      /   NOPRINT
                            ORDER
                        ;

    DEFINE      N2      /   NOPRINT
                        ;

    DEFINE      ID_N    /   'ID'
                            COMPUTED
                        ;

    DEFINE      C1      /   NOPRINT
                            ORDER
                        ;

    DEFINE      C2      /   NOPRINT
                        ;

    DEFINE      NAME    /   'Name'
                            COMPUTED
                        ;

    COMPUTE ID_N / CHARACTER LENGTH=3;
        * I am sorting on N1, but I want to repeat N1 for each row
        * so carry the value from one row to the next when it is missing  ;
        IF NOT MISSING(N1) THEN N1_tmp = N1;

        ID_N = CATX( '.', N1_tmp, N2 );
    ENDCOMP;

    COMPUTE NAME / CHARACTER LENGTH=7;
        * I am sorting on C1, but I want to repeat C1 for each row
        * so carry the value from one row to the next when it is missing  ;
        IF NOT MISSING(C1) THEN C1_tmp = C1;

        NAME = CATX( '-', C1_tmp, C2 );
    ENDCOMP;

RUN;

これが結果です...

ID  Name
1.. G-S
2.. A-B
2.. J-P
3.. L-Q
4.. T-S
5.. K-W
5.. X-T
5.. X-E

私が見る限り、文字フィールドの処理方法と数値フィールドの処理方法にまったく違いはありませんが、結果に違いがあるのはなぜですか?

4

2 に答える 2

1

私は PROC REPORT の専門家ではありません (または中級ユーザーですらありません)。ただし、データステップを使用してこれを回避し、「計算された」列を作成します。

そのようです:

data temp;
set example;
format C1_tmp $7. ID_N $3. NAME $7.;
retain N1_tmp C1_tmp;
IF NOT MISSING(N1) THEN N1_tmp = N1;

ID_N = CATX( '.', N1_tmp, N2 );

IF compress(C1) ^= "" THEN C1_tmp = C1;

NAME = CATX( '-', C1_tmp, C2 );

run;

PROC REPORT DATA=Work.temp nowindows;

    COLUMNS     N1
                ID_N
                C1
                NAME
                ;

    DEFINE      N1      /   NOPRINT
                            ORDER
                        ;
    DEFINE      ID_N    /   'ID'
                        ;

    DEFINE      C1      /   NOPRINT
                            ORDER
                        ;
    DEFINE      NAME    /   'Name'
                        ;
RUN;
于 2013-09-13T17:21:57.813 に答える