2017-04-09 5 views
0

Hat SAS ein Äquivalent von + = oder * = Ausdruck genau wie die Sprache C++?Entspricht + =/* = operator in sas

Zum Beispiel habe ich eine Liste von Variablen X1-X10, und ich mag eine Variable Finale in der folgenden Form definieren:

%let name= X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 
%Macro Total; 
%Do i=1 %to %sysfunc(countw(&name., " ")); 
    %Let K= %sysfunc(scan(&name., %i., " ")); 
     Final *= K; 
%End; 
%Mend; 

Antwort

0

nicht sicher, warum Sie es mit Makro-Code zu tun versuchen. Wenn Sie Daten bearbeiten möchten, verwenden Sie einen Datenschritt.

Es gibt eine Sum-Anweisung.

var + (expression) ; 

Zum Beispiel, wenn ich wollte eine kumulative Summe von einer Variablen berechnen ich dies tun könnte:

data want; 
    set have ; 
    cum_X + X; 
run; 

Aber es gibt keine ähnliche Aussage Aggregat Produkte zu tun. Wenn Sie eine ähnliche Sache mit Multiplikation machen wollten, müßten Sie die RETAIN-Anweisung buchstabieren und eine normale Zuweisungsanweisung verwenden.

data want; 
    set have ; 
    retain prod_x 1 ; 
    prod_x = prod_x * x; 
run; 

Wenn Sie tatsächlich nur noch eine Makrovariable mit einer Liste von Variablennamen und Sie Ameise zu einem Zeitpunkt streng auf einer einzigen Beobachtung arbeiten, dann können Sie nur Textbearbeitung verwenden, um die Liste in die Berechnung konvertieren Sie wollen .

%let namelist = vara varb vard varx vary varz ; 
data want ; 
    set have ; 
    sum = %sysfunc(tranwrd(&namelist,%str(),+)) ; 
    product = %sysfunc(tranwrd(&namelist,%str(),*)) ; 
run; 

Wenn Sie mehr Kontrolle wollen, dann definieren Sie ein Array und Schleife darüber. Hier ist ein Beispiel, das die DO OVER-Syntax verwendet. (SAS versucht DO OVER loszuwerden, so dass Sie auch das gleiche tun können einen Index Variable und mehr Zeichen in Ihren Array Referenzen eingeben.)

data want; 
    set have ; 
    array x &namelist ; 
    sum=0; 
    product=1; 
    do over x ; 
    if not missing(x) then do ; 
     sum= sum+x ; 
     product = product*x ; 
    end; 
    end; 
run;