2016-07-11 5 views
1

Ich habe versucht, eine Liste von Variablen zu generieren, deren Namen in einem Makro & varsnew gespeichert sind. Der Wert der ersten (2., 3. usw.) dieser Variablen ist gleich (a) der 1. (2., 3. usw.) einer anderen Liste von Variablen, deren Namen in einem anderen Makro & varsold gespeichert sind, wenn die Variable in & varsold fehlt nicht, oder (b) 0, wenn die Variable in & varsold fehlt.Coalesce funktioniert nicht in sas Makro?

Der folgende Code funktioniert gut, wo ich If-Then-Klausel verwenden, um Variablen in & Varsnew zu definieren.

%macro coal; 
    data DS; 
    set DS; 
    %do i=1 %to %sysfunc(countw(&varsold.)); 
    if %scan(&varsold.,&i.)<=.z then %scan(&varsnew.,&i.)=0 ; 
    else %scan(&varsnew.,&i.)=%scan(&varsold.,&i.); 
    %end; 
    run; 
%mend; 

%coal; 

Allerdings, wenn ich die coalesce Funktion Variablen in & varsnew zu definieren, wie in der folgenden, dann wird der Code nicht funktioniert. Ich bin verwirrt.

%macro coal; 
    data DS; 
    set DS; 
    %do i=1 %to %sysfunc(countw(&varsold.)); 
    %scan(&varsnew.,&i.)= %sysfunc(coalesce(%scan(&varsold.,&i.),0)); 
    %end; 
    run; 
%mend; 

%coal; 
+0

Was meinst du mit "funktioniert nicht?" – superfluous

+0

FEHLER: Argument 1 für die Funktion COALESCE, auf die von der Makrofunktion% SYSFUNC oder% QSYSFUNC verwiesen wird, ist keine Zahl. – Jay

+1

Sie müssen 'COALESCEC()' verwenden, wenn Sie Zeichenwerte verwenden. Die Funktion '% SCAN()' gibt einen Variablennamen und keine Zahl zurück. – Tom

Antwort

3

Ihre zwei Schleifen machen zwei verschiedene Dinge. Der erste prüft, ob eine Datensatzvariable fehlt, und der zweite prüft, ob die Listen von Variablennamen die gleiche Anzahl von Einträgen haben. Aktivieren Sie die MPRINT-Option, damit Sie sehen können, welchen SAS-Code Ihr Makro generiert.

Die erste wird erzeugen Code wie:

if OLD1<= .Z then NEW1=0; ELSE NEW1=OLD1; 

Der zweite Code erzeugen wie:

NEW1=OLD1; 
NEW2=OLD2; 
NEW3=0; 

Sie wahrscheinlich diese stattdessen wollen.

%do i=1 %to %sysfunc(countw(&varsold)); 
    %scan(&varsnew,&i)=coalesce(%scan(&varsold,&i),0); 
%end; 

Oder nur

%do i=1 %to %sysfunc(countw(&varsold)); 
    %scan(&varsnew,&i)=sum(%scan(&varsold,&i),0); 
%end; 

Oder noch besser die Makro Logik vergessen und schreiben Sie einfach die ganze Sache einfach SAS-Anweisungen.

array _new &varsnew ; 
array _old &varsold ; 
do i=1 to dim(_new); 
    _new(i)=sum(_old(i),0); 
end;