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
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.