2016-12-01 3 views
0

Ich habe einen Datensatz, der nach einem dynamischen Wert eine bestimmte Anzahl von Zeilen ausgeblasen werden muss. Nehmen Sie den Datensatz unten zum Beispiel:SAS: Dynamisch eine bestimmte Anzahl von Zeilen kopieren

DATA HAVE; 
    LENGTH ID $3 COUNT 3; 
    INPUT ID $ COUNT; 
    DATALINES; 
    A 4 
    B 3 
    C 1 
    D 2 
    ; 
RUN; 

ID = A 4 ​​Reihen ausgeblasen werden muss, ID = B 3 Reihen ausgeblasen werden muss usw. Der resultierende Datensatz als solche aussehen würde (minus ein Bündel von andere Variablen ich habe):

A 1 
A 2 
A 3 
A 4 
B 1 
B 2 
B 3 
C 1 
D 1 
D 2 

Der folgende Code in einem Umfang funktioniert, aber ich habe Probleme dynamisch die &COUNT. Makroeinstellung. Ich habe versucht, eine CALL SYMPUTX("COUNT",COUNT)-Anweisung einzufügen, so dass beim Überschreiben jeder Zeile die Anzahl in das Makro gesetzt wird und die Zeile bei dieser Anzahl von Zeilen durchgebrannt wird.

** THIS CODE ONLY WORKS IF YOU SET COUNT= TO SOME VALUE **; 
%MACRO LOOPOVER(); 
DATA WANT; SET HAVE; 
    DO UNTIL(LAST.ID); 
    BY ID;    
     %DO I=1 %TO &COUNT.; 
      COUNT = &I.; OUTPUT; 
     %END; 
    END; 
RUN; 
%MEND; 

%LOOPOVER; 

** THIS CODE DOESN'T WORK BUT I'M NOT SURE WHY?? **; 
%MACRO LOOPOVER(); 
DATA WANT; SET HAVE; 
    DO UNTIL(LAST.ID); 
    BY ID; 
     CALL SYMPUTX("COUNT",COUNT); /* NEW LINE HERE */ 
     %DO I=1 %TO &COUNT.; 
      COUNT = &I.; OUTPUT; 
     %END; 
    END; 
RUN; 
%MEND; 

%LOOPOVER; 

Antwort

2

Es ist nicht notwendig, Makro zu verwenden.

data want(rename=(_count=count)); 
    set have; 
    do i=1 to count; 
     _count=i; 
     output; 
    end; 
    drop count; 
run; 
+2

Sie brauchen eigentlich keine neue Variable. 'zählen = 1 zu zählen; Ausgabe; Ende; 'wird gut funktionieren. – Tom

+0

Wow, ich habe das übertrieben. Danke euch beiden! – Foxer

Verwandte Themen