格式化纯文本 proc 报告输出时的垂直对齐

Vertical alignment in formatting plain-text proc report output

我正在尝试将 proc report 的输出格式化为纯文本。我有一个变量,我通过它对观察结果进行分组并且跨越两行。这会导致明显的换行并将分组的观察结果分开。有什么好的方法可以解决这个问题吗?

以下最小示例说明了该问题。

编辑:该程序最好也只适用于某些科目的一次观察。

程序:[=3​​7=]

* Toy data ;

data mydata;
  length subj $ 20;
  input subj $ val val2;
  datalines;
ID001|M 7.1 5.2
ID001|M 7.1 4.9
ID001|M 7.1 5.3
ID001|M 7.1 5.6
ID001|M 7.1 5.7
ID020|F 7.1 3.2
ID020|F 7.3 2.9
ID020|F 7.2 0.9
ID300|M 7.2 1.2
ID300|M 7.2 1.8
;
run;

* Create report ;

ods listing;
proc report data=mydata headline headskip split='|';
  column(subj val val2);
  define subj / order flow 'Subject ID|Sex';
  define val  / 'Value 1';
  define val2 / 'Value 2';

  break after subj / skip;
run;
ods _all_ close;

输出:

Subject ID                                
Sex                     Value 1    Value 2
------------------------------------------

ID001                       7.1        5.2
M                                         
                            7.1        4.9
                            7.1        5.3
                            7.1        5.6
                            7.1        5.7

ID020                       7.1        3.2
F                                         
                            7.3        2.9
                            7.2        0.9

ID300                       7.2        1.2
M                                         
                            7.2        1.8

期望输出:

Subject ID                                
Sex                     Value 1    Value 2
------------------------------------------

ID001                       7.1        5.2
M                           7.1        4.9
                            7.1        5.3
                            7.1        5.6
                            7.1        5.7

ID020                       7.1        3.2
F                           7.3        2.9
                            7.2        0.9

ID300                       7.2        1.2
M                           7.2        1.8

替代的期望输出:

Subject ID                                
Sex                     Value 1    Value 2
------------------------------------------

ID001                     
M                           7.1        5.2
                            7.1        4.9
                            7.1        5.3
                            7.1        5.6
                            7.1        5.7

ID020                                       
F                           7.1        3.2
                            7.3        2.9
                            7.2        0.9

ID300                       
M                           7.2        1.2
                            7.2        1.8

或与这些类似的东西,在视觉上清楚地将组分开。

我缩进了性别,但你可以删除它。确保每个主题有 2 个或更多 obs。

data mydata;
   length subj $ 20;
   input subj $ val val2;
   length sex ;
   sex = '  '||scan(subj,-1);
   subj = scan(subj,1);
   datalines;
ID001|M 7.1 5.2
ID001|M 7.1 4.9
ID001|M 7.1 5.3
ID001|M 7.1 5.6
ID001|M 7.1 5.7
ID020|F 7.1 3.2
ID020|F 7.3 2.9
ID020|F 7.2 0.9
ID300|M 7.2 1.2
ID300|M 7.2 1.8
;;;;
   run;

proc print;
   run;
* Create report ;

*ods listing;
proc report data=mydata headline headskip split='|' list 
/*      showall*/
      ;
   column(subj sex stub val val2);
   define subj / order noprint;
   define sex  / order noprint;
   define stub / computed width=10 'Subject' '  Gender';
   define val  / 'Value 1';
   define val2 / 'Value 2';
   break after subj / skip;
   compute before subj;
      xsubj = subj;
      endcomp;
   compute before sex;
      j = 0;
      xsex = sex;
      endcomp;
   compute stub / char length=20; 
      j + 1;
      if      j eq 1 then stub = xsubj;
      else if j eq 2 then stub = xsex;
      else                stub = ' ';
      endcomp;
   run;

只要确保所有受试者都有两个或更多 obs,如果需要的话可以添加一个。

data addonemaybe / view=addonemaybe;
   set mydata;
   by subj;
   output;
   if first.subj and last.subj then do;
      call missing(of val:);
      output;
      end;
   run;