LesezeichenAbonnierenRSS-Feed abonnieren
krl
Calcite | Level 5 krl
Calcite | Level 5

Hallo Leute,

 

ich bin ganz neu in SAS und habe ein Problem. Ich habe eine Tabelle erstellt, möchte nun aber die Datensätze, welche leere Felder enthalten, herauslöschen. Also müsste ich diese ja darauf filtern, dass die Felder gefüllt sind.

 

Hat jemand eine Idee?

 

Vielen Dank schonmal 🙂

6 ANTWORTEN 6
Kurt_Bremser
Super User

Definiere "leere Felder".

Numerische missing values in SAS werden als . abgebildet und können so auch in Bedingungen angesprochen werden:

if numval = . then delete;

Da Zeichen (character) Variable immer mit Blanks aufgefüllt werden, kann man sie ganz einfach mit einem Null-String vergleichen:

if charval = '' then delete;

Beispiel:

data have;
infile cards dsd truncover dlm=' ';
input charval $ numval;
cards;
xxx 1
xxx .
xxx
 1

 .
 ;
 run;

data want;
set have;
if charval = '' and numval = . then delete;
run;

 

krl
Calcite | Level 5 krl
Calcite | Level 5

Vielen Dank für die schnelle Antwort!

Es waren numerische Werte und ich hab nicht an die Darstellung mit dem Punkt gedacht. Jetzt geht es 🙂

AHuesing
Calcite | Level 5

Für eine (unspezifisch lange) Liste von numerischen und Character-Variablen wäre das folgende Beispielprogramm geeignet:

 

title 'Find first and last variable in dataset';

proc contents data=sashelp.heart varnum;
RUN;

DATA sauber;
SET sashelp.heart;
    * define block of all numeric variables between first and last;
array num (*) status-numeric-Smoking_Status;
    * define block of all character variables between first and last;
array char (*) status-character-Smoking_Status;

* delete if any numeric variable is missing;
DO i=1 TO dim(num);
IF num(i)=. THEN delete;
END;

* delete if any character variable is missing;
DO j=1 TO dim(char);
IF char(j)='' THEN delete;
END;
RUN;


title 'Numerische Variablen sauber';

proc means data=sauber nmiss;
RUN;

 

 

FreelanceReinh
Jade | Level 19

Hallo @krl und willkommen bei CoDe SAS!

 

Sollen nur diejenigen Datensätze gelöscht werden, in denen alle Variablen missing sind? Dann würde ich es so machen:

options missing=' ';

data want;
set have;
if cats(of _all_) ne ' ';
run;

Den Trick, hier die MISSING-Option umzustellen, um auch die numerischen Missings per CATS als Leerzeichen abzufangen, habe ich selbst eben erst in einem Post von 2013 gesehen. Das Archiv der Communities ist schon sehr ergiebig. Die Option sollte danach am besten auf den vorherigen Wert zurückgestellt werden, typischerweise:

options missing='.';

 

Falls bereits ein einziger fehlender Wert zur Löschung des Satzes führen soll, würde das selektierende IF-Statement beispielsweise

if cmiss(of _all_)=0;

lauten und man bräuchte die MISSING-Option nicht vorher umzustellen.

JMS
Obsidian | Level 7 JMS
Obsidian | Level 7

Ich habe in den letzten 30 Jahren noch keine Sätze aus einer Tabelle gelöscht, weil Felder leer waren.

Wenn ich etwas berechnen will, berechne ich nur mit den Sätzen, die für die Berechnung relevant sind.

Wenn ich etwas drucken will, druck ich nur die Sätze, die man sehen soll.

Aber Sätze löschen? Nein, das braucht man nie.

 

FreelanceReinh
Jade | Level 19

Beim Einlesen von Rohdaten, z. B. aus Excel-Tabellen, könnte es vorkommen, dass man (evtl. versehentlich) eine oder mehrere Leerzeilen mit einliest, die dann gute Kandidaten für so eine Löschung wären.