LesezeichenAbonnierenRSS-Feed abonnieren
Barbara_Ger_
Calcite | Level 5

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

 

7 ANTWORTEN 7
Kurt_Bremser
Super User

_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.

Barbara_Ger_
Calcite | Level 5

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...

BrunoMueller
SAS Super FREQ

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

FreelanceReinh
Jade | Level 19

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.

GrischaPfister
Fluorite | Level 6

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;

Barbara_Ger_
Calcite | Level 5

Oh, Mann, jetzt habe ich glatt mehr gelernt, als ich ursprünglich wollte... Smiley (überglücklich)

 

Danke an alle.

Gruß Barbara

sas-innovate-2024.png

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.

 

Register now!

Diskussionsstatistiken
  • 7 Antworten
  • 1398 Aufrufe
  • 2 Kudos
  • 5 in Unterhaltung