2016-10-20 2 views
0
data AXPM061204200; 
set a; 
call execute ("data work.data_"||strip(put(_ric,$13.))||"_"||strip(put(date,yymmddn8.))||"; 
       set work.a;if date="||date||" and _ric="||input(_ric,$13.)||";run;"); 
run; 

Ich habe eine große Datenmenge, die mehrere Daten (von 20120103 bis 20121205) und Verträge (_ric = AXPM061204200.c, AXPC061204200.c und so weiter) enthält.SAS- Wie wird ein großer Datensatz nach bestimmten Anforderungen aufgeteilt?

Ich habe versucht, "Aufruf execute" zu verwenden, um den Datensatz zu teilen, und hier ist mein Code. Es kann nur nach Datum geteilt werden, aber im Vertragsnamen (_ric) fehlschlagen. Der Fehler lautete: Variable AXPM061203800 ist nicht initialisiert. Wie kann ich dieses Problem lösen?

Antwort

2

Der Code ist in Ordnung, nach DomPazz Korrektur, aber es ist nicht gut optimiert ist.

Sie lesen Ihre Quelldaten oft, aber es ist möglich, diesen Datensatz nur zweimal zu lesen.

Überprüfen Sie diese Lösung und vergleichen Sie die Leistung beider Codes.

%macro split; 
proc sql; 
    create table tmp as 
    select distinct date, _ric 
    from work.a; 

    select count(*) 
    into :obs 
    from work.tmp; 

    %let obs=&obs.; 

    select date, _ric, catx("_", "work.data", substr(_ric, 1, 13), put(date, yymmddn8.)) 
    into :date1-:date&obs., :ric1-:ric&obs., :setname1-:setname&obs. 
    from work.tmp; 
quit; 

data 
%do i = 1 %to &obs.; 
    &&setname&i 
%end; 
; 
    set work.a; 
select; 
%do i = 1 %to &obs.; 
    when(_ric = "&&ric&i" and date = &&date&i) output &&setname&i; 
%end; 
end; 
%mend split; 

%split 
+0

Danke! Ich bin nicht gut im Makro, also versuche ich normalerweise, Makro zu vermeiden. Aber ich werde es versuchen, das scheint effizienter! – Neal801

+0

Hallo, Ihr Code könnte einen Fehler haben. SAS meldete Fehler als " – Neal801

+0

Hallo, Ihr Code kann einen Fehler aufweisen. SAS meldete Fehler als" Hinweis: Das SAS-System beendete die Verarbeitung dieses Schritts aufgrund von Fehlern. WARNUNG: Der Datensatz WORK.DATA_AXPA061203500_20120103 ist möglicherweise unvollständig. Wenn dieser Schritt gestoppt wurde, gab es 0 Beobachtungen und 106 Variablen. WARNUNG: Der Datensatz WORK.DATA_AXPA061203500_20120103 wurde nicht ersetzt, da dieser Schritt gestoppt wurde. – Neal801

1

Ihr Problem ist hier:

" and _ric="||input(_ric,$13.)||" 

Das wird lösen zu

if ... and _ric=AXPC061204200.c 

SAS denkt, dass AXPC061204200.c eine Variable ist und beschwert sich, dass er nicht weiß, was es ist.

Wechsel zu (man beachte die zusätzliche ' ich hinzugefügt)

" and _ric='"||input(_ric,$13.)||"' 

werden Sie SAS senden

if ... and _ric=`AXPC061204200.c` 
+0

Vielen Dank !!!!! Es klappt!! Und ich habe noch eine kleine Frage. Wenn _ric eine numerische Variable ist (wie 123), wie könnte ich diese numerische Variable in dieser Situation übernehmen? Wenn ich Datum verwenden kann, um SAS mitzuteilen, dass es sich um eine Datumsvariable handelt, hat es einen "Code", um SAS mitzuteilen, dass dies eine numerische Variable ist? – Neal801

+0

entfernen Sie die '' ', dann verwenden Sie die' put (_ric, best.) '-Funktion, um Ihre numerischen Variablenwert zu schreiben. Sie können das Format nach Bedarf ändern. 'put (var, format)' konvertiert eine numerische Variable unter Verwendung des angegebenen Formats in Text. – DomPazz

Verwandte Themen