Hallo zusammen,
ich habe ein Problem, bei dem ich glaube, dass es keines sein sollte.
Ich möchte 2 Datasets, die von der Anzahl, Art und Benennung der Variablen identisch sind, mit einem Proc Compare auf inhaltliche Unterschiede vergleichen.
Das Problem dabei ist, dass fast alle Variablen das Format 1. haben. Ist nach dem Compare der Inhalt dieser Variablen beim Beobachtungstyp Dif gleich -1 ist das Format zu klein und im Log erscheint die Meldung "ERROR: Asterisks are an indication of a format width problem.". Deshalb wollte ich das Format für alle Variablen einfach vergrößern und zwar mit einem Format Statement im Data Step wie folgt:
DATA okt;
format _numeric_ 5.;
set studie2.atc_medigruppen_20151030;
RUN;
Leider funktioniert das nicht. Falls ich statt _numeric_ den expliziten Variablennamen ins Format Statement schreibe, funktioniert es. Aber da ich 246 dieser Variablen habe, suche ich nach einer einfacheren Lösung.
Kann mir jemand erklären, was das Problem ist und/oder wie ich zu einer Lösung komme?
Vielen Dank und viele Grüße
Barbara
_NUMERIC_ funktioniert im FORMAT nicht, das möchte eine Liste von Variablen.
Man kann aber alle numerischen Variablen so in eine Makrovariable packen:
proc sql;
select name into :spalten separated by ' '
from dictionary.columns
where libname = 'STUDIE2' and memname = 'ATC_MEDIGRUPPEN_20151030' and type = 'num';
quit;
und dann
format &spalten 5.;
im DATA Step machen.
Hallo Herr Bremser,
vielen Dank für die schnelle Antwort. Nach ein bisschen puzzeln, habe ich es hinbekommen, mein memname= 'ATC_MEDIGRUPPEN_20151030' hat er nämlich nicht gemocht (zu lang? Unterstriche?), aber so funktioniert's:
DATA okt; set studie2.atc_medigruppen_20151030; RUN; PROC SQL; select name into :spalten separated by ' ' from dictionary.columns where libname = 'WORK' and memname = 'OKT' and type = 'num'; QUIT; DATA okt2; format &spalten 5.; set work.okt; RUN;
Vielen Dank nochmal.
Barbara
PS: Warum ich überhaupt auf das _numeric_ im Format Statement kam? Es wurde in diesem Beitrag im Forum empfohlen: https://communities.sas.com/kntur85557/attachments/kntur85557/code_sas/1448/1/1538_Format_auf_mehrer...
Um das Format einer Variable zu ändern muss die Datei nicht nocheinmal gelesen werden.
Dies kann man schneller mit Proc DATASETS machen.
Hier ein Beispiel:
data newClass;
set sashelp.class;
run;
ods select variables;
proc contents data=newclass;
run;
proc datasets lib=work nolist;
modify newClass;
format _numeric_ roman.;
run;
quit;
ods select variables;
proc contents data=newclass;
run;
Bruno
Das Problem in dem Datastep besteht lediglich darin, dass das FORMAT-Statement nach dem SET-Statement stehen muss, damit sich _numeric_ auf die Variablen in dem "gesetteten" Dataset beziehen kann.
Oh, Mann, da sag nochmal einer was von betriebsblind. Ja natürlich, das ist es.
Hallo Barbara,
wenn es nur darum geht, bei Proc Compare die Formate zu ignorieren, kannst Du das Format-Statement auch in den Aufruf von Proc Compare einfügen und hier alle Format-Informationen für die (numerischen) Variablen entfernen.
Der erste Aufruf im Proc Compare wird auf die unterschiedlichen Formate hinweisen, beim zweiten Aufruf werden die Formate ignoriert, da mit "Format _numeric_;" alle Format-Informationen für den Lauf von Proc Compare ausgeblendet sind.
Dieses "Null-" Format-Statement ist immer mal wieder nützlich, wenn z.B. benutzerdefinierte Formate nicht gefunden werden...
Viele Grüße,
Grischa
Data Work.Test;
Set sashelp.class;
Format _numeric_ roman10.;
Run;
Proc Compare base=sashelp.class compare=work.test;
Run;
Proc Compare base=sashelp.class compare=work.test;
Format _numeric_ ;
Run;
Oh, Mann, jetzt habe ich glatt mehr gelernt, als ich ursprünglich wollte...
Danke an alle.
Gruß Barbara
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!