我正在使用PROC REPORT比较两个字段并将结果存储在第三个计算字段中。我的一些字段是数字的,有些是字符。我不想显示要比较的字段,只显示结果,因此我在定义字段时应用了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报告
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
据我所知,在处理字符字段与处理数字字段的方式之间没有任何区别,那么为什么结果会有差异呢?
答案 0 :(得分:1)
我不是PROC REPORT专家(甚至是中级用户)。但是,我会使用datastep解决这个问题,以创建“计算”列。
像这样:
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;
答案 1 :(得分:1)
您需要将N2定义为display
,所以
DEFINE N2 / display NOPRINT;
N2作为数字默认为ANALYSIS (see Analysis Variables),因此您在技术上无法访问N2(但可以访问您定义为ORDER的N1),而是N2.SUM
,N2.MEAN
,诸如此类( N2.SUM
是默认值,我相信。)
您也可以要求_C2_
。