2016-07-13 21 views
1

Ich habe eine Reihe SAS Daten sagen, df wie folgt aus:Zeilen löschen in SAS-Datensatz, in der alle anderen Werte werden außer einer Spalte fehlt

Input: 
A B C D 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 

-Code für die Datenerstellung:

data df; 
    input A B C D; 
    DATALINES; 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 
; 
run; 

Jetzt möchte ich die ersten 2 Zeilen löschen. Die Logik, die ich brauche, ist diese Zeilen in df zu löschen, wo alle Werte in einer Reihe außer in A fehlen.

Output: 
A B C D 
3 0 1 1 
4 1 0 1 

Ich bin sehr neu für SAS und ich bitte eine Antwort ohne proc sql.

Hinweis: Hier gab ich nur 4 Spalten. Eigentlich habe ich mehr als 25 columns.I brauchen eine allgemeine Antwort ohne Spaltennamen B, C, D

+0

Es kann verschiedene Spalten mit fehlenden Werten in jeder Zeile geben? –

+0

Nein, meine Anforderung ist, ich habe immer einen Wert in A. Nur B bis D werden immer fehlende Werte haben. –

Antwort

0
data result; 
    set df; 
    where ^missing(B) and ^missing(C) and ^missing(D); 
run; 

oder

proc sql noprint; 
    create table result as 
    select * 
    from df 
    where ^missing(B) and ^missing(C) and ^missing(D); 
quit; 

EDIT:

proc contents data=df out=df_CONTENTS; run; 
proc sql noprint; 
    select cats('^missing(',NAME,')') into :var_names separated by ' and ' 
    from df_CONTENTS 
    where NAME ^= 'A'; 
quit; 

und dann können Sie den Wert 'var_names' für die Bedingung in where-Klausel verwenden wie:

where &var_names;

+0

Sorry Andrey, ich habe vergessen, die Note früher zu erwähnen. Aktualisierte Notiz. Wie auch immer, danke für die Antwort. –

1

alle relevanten Variablen in einem Array Setzen und die Anzahl der nicht fehlenden Werte zählen. Ausgabe aller Zeilen mit einem oder mehreren nicht fehlenden Werten.

data want; 
    set df; 
    array varlist B -- D; 
    do over varlist; 
     not_missing = sum(not_missing, ^missing(varlist)); 
    end; 
    if not_missing > 0 and ^missing(A) then output; 
run; 
+0

Die Logik schlägt fehl, wenn ich einen nicht fehlenden Wert in B oder C oder D in den ersten 2 Zeilen habe und A fehlt. Ich meine, wenn A null ist und B in der ersten Zeile nicht null ist, bleibt es als Ausgabe erhalten. –

+0

Können Sie in Ihren Fragen ein Datenbeispiel angeben? Möchten Sie nach Missings in A suchen? Ich werde meine Antwort ändern, um A. separat zu überprüfen. – Jetzler

1

Wenn alle Variablen numerisch sind dann die n Funktion arbeiten, da dies die Anzahl der nicht-fehlenden Werten zählt.

data have; 
Input A B C D; 
datalines; 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 
; 
run; 

data have; 
modify have; 
if n(of B--D)=0 then remove; 
run; 
+0

Die Logik ist gut für numerische Spalten, aber ich habe auch Zeichenspalten –

+0

Verwenden Sie stattdessen CMISS() -Funktion, aber Sie müssen wissen, wie viele Variablen es gibt. 'wenn cmiss (von b - d) <3;' – Tom

+0

@Tom Genau das, was ich gerade wollte. Außer es sollte sagen, 3, nicht <3 – Longfish

3

können Sie die CMISS() Funktion auf beiden Zahlen- und Zeichenvariablen verwenden. Aber Sie müssen wissen, wie viele Variablen es gibt.

data have; 
    input A B C $ D; 
cards; 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 
; 

data want; 
    set have; 
    if cmiss(of B--D)<3 ; 
run; 
Verwandte Themen