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