2

我正在使用 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 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 回答
1

您需要将 N2 定义为display,所以

DEFINE      N2      /   display NOPRINT;

N2 作为数字默认为ANALYSIS (请参阅分析变量),因此您在技术上无法访问 N2(但可以访问您定义为 ORDER 的 N1),而是N2.SUM, N2.MEAN, whatnot (N2.SUM我相信是默认值)。

你也可以要求_C2_

于 2013-09-13T17:55:02.360 回答