2016-02-03 1 views
1

J'essaye de formater la sortie de proc report en texte brut. J'ai une variable par laquelle je groupe des observations et qui s'étend sur deux lignes. Cela provoque une rupture de ligne apparente et sépare les observations groupées. Existe-t-il un moyen efficace de résoudre ce problème?Alignement vertical lors de la mise en forme de la sortie de rapport de proc en texte brut

L'exemple minimal suivant illustre le problème.

EDIT: Le programme devrait de préférence également fonctionner pour une seule observation chez certains sujets.

programme:

* 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; 

sortie:

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 

sortie désiré:

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 

Alternative sortie désirée:

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 

Ou quelque chose de semblable à ce qui sépare visuellement clairement les groupes.

Répondre

3

J'ai indenté le genre mais vous pouvez le supprimer. Assurez-vous de 2 ou plus obs par sujet.

data mydata; 
    length subj $ 20; 
    input subj $ val val2; 
    length sex $3; 
    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; 

enter image description here

+0

Merci pour la réponse. Malheureusement, cela devrait aussi fonctionner pour 1 observation par sujet. Avez-vous une suggestion pour gérer cela? –

+0

Je pense que vous voudrez aussi OPTIONS MISSING = ''; si vous ne l'avez pas déjà. Puis-je vous demander pourquoi vous utilisez la sortie LISTING? –

0

Assurez-vous que tous les sujets ont deux ou plusieurs obs en ajoutant un si nécessaire.

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

Cela appartient à l'autre réponse, pas comme une réponse séparée. – Joe

+0

Je ne voulais pas modifier ma réponse. Down-vote ou modifier vous êtes le modérateur. –

+0

Je ne suis pas un modérateur, en fait (ils ont des diamants à côté de leur nom) ... mais vous devriez le modifier dans l'autre réponse. Ce n'est pas un forum - les réponses doivent être autonomes, pas séquentielles. – Joe