2016-08-08 53 views
0

Ich möchte einen Bericht über alle Variablen in meiner Longitudinal-/Panel-Daten nach Stadt. PROC MEANS war großartig dafür, aber dies kann nicht die Aufnahme von Spalten mit dem ersten und letzten Datum, für das die betreffende Variable ist nicht zu vermeiden.SAS bestimmt die erste und letzte nicht fehlende ID/Datum nach Klasse für jede Variable

Meine Daten sieht etwa so aus:

data have; 
input date $ city $ var1 var2 var3; 
     datalines; 
2006Q1 NYC . 0.1 4 
2006Q2 NYC . 0.48 6 
2006Q3 NYC . 0.55 7 
2006Q4 NYC 5 0.33 2 
2007Q1 NYC 8 . 10 
2007Q3 NYC 12 . 15 
2006Q1 BOS 11 0.6 . 
2006Q2 BOS 6 0.81 . 
2006Q3 BOS 1 0.66 9 
2006Q4 BOS 2 0.5 1 
2007Q1 BOS 4 0.61 8 
2007Q3 BOS 19 0.4 1 
; 
run; 

Meine gewünschte Ausgabe ist eine Tabelle, die etwa wie folgt aussieht:

City Variable First Nonmiss Last Nonmiss 
BOS var1 2006Q1   2007Q3 
BOS var2 2006Q1   2007Q3 
BOS var3 2006Q3   2007Q3 
NYC var1 2006Q4   2007Q3 
NYC var2 2006Q1   2006Q4 
NYC var3 2006Q1   2007Q3 

Vielleicht ein PROC TRANSPOSE mit einem create table in PROC SQL ist der beste Weg, um Mach das, aber ich bin offen für Vorschläge - und ich bin mir nicht sicher, wo ich anfangen soll.

Danke!

+1

Dies ist definitiv unmöglich in 'PROC MEANS' (es ist nicht eine der Statistiken' PROC MEANS' Angebote). Sie sollten diese Frage entweder neu strukturieren, um zu fragen, wie Sie dies allgemein berechnen (durchaus möglich) oder, wenn dies berechnet wird, wie Sie dies ähnlich wie PROC MEANS ausgeben (auch durchaus möglich). Die beiden Dinge sind ausreichend verschieden, aber ich sehe sie nicht als eine Frage. – Joe

+0

Darn. Danke, dass du @Joe bestätigt hast. Ich habe die Fragen entsprechend umgekrempelt. –

Antwort

1

Ich würde auf jeden Fall einen proc transpose Ansatz hier machen; Es ist sehr einfach. Dies nutzt den Vorteil, dass first. und definiert sind, nachdem die where Klausel implementiert ist.

proc sort data=have; 
    by city date; 
run; 

proc transpose data=have out=have_t; 
    by city date; 
    var var1-var3; 
run; 

proc sort data=have_t; 
    by city _name_ date; 
run; 

data want; 
    set have_t; 
    by city _name_ date; 
    retain first_nonmiss; 
    where not missing(col1); 
    if first._name_ then do; 
    first_nonmiss = date; 
    end; 
    if last._name_ then do; 
    last_nonmiss = date; 
    output; 
    call missing(of first_nonmiss); *I like to do this for safety even though it is irrelevant here - later code might make it relevant; 
    end; 
run; 
+0

Das ist fantastisch. Vielen Dank! Ich möchte nur sicherstellen, dass ich verstehe, was in diesem letzten "Daten" -Schritt passiert. Also, das 'where not missing (col1)' untergliedert die Daten nach 'col1' und das' if first.' und 'if last.' geben einfach die entsprechenden Zeilen zurück, dies gilt für jede Gruppe (?). Und der Befehl 'by city _name_ date' erstellt diese city/_name_ Gruppen automatisch? Auch, warum ist das 'retain first_nonmissing' dort, aber nicht für' last_nonmiss'. (Die 'call missing()' ist immer noch nicht mein Verständnis, aber immer glücklich, Best Practices zu lernen!) –

0

Es ist auf jeden Fall möglich, diese Ausgabe mit PROC MEANS/Zusammenfassung zu bekommen, aber Sie müssen die Daten transponieren, so dass meine Antwort disqualifizieren können.

data have; 
input date $ city $ var1 var2 var3; 
     datalines; 
2006Q1 NYC . 0.1 4 
2006Q2 NYC . 0.48 6 
2006Q3 NYC . 0.55 7 
2006Q4 NYC 5 0.33 2 
2007Q1 NYC 8 . 10 
2007Q3 NYC 12 . 15 
2006Q1 BOS 11 0.6 . 
2006Q2 BOS 6 0.81 . 
2006Q3 BOS 1 0.66 9 
2006Q4 BOS 2 0.5 1 
2007Q1 BOS 4 0.61 8 
2007Q3 BOS 19 0.4 1 
; 
run; 
proc print; 
    run; 
data want; 
    input City $ Variable $ First_Nonmiss $ Last_Nonmiss $; 
    cards; 
BOS var1 2006Q1   2007Q3 
BOS var2 2006Q1   2007Q3 
BOS var3 2006Q3   2007Q3 
NYC var1 2006Q4   2007Q3 
NYC var2 2006Q1   2006Q4 
NYC var3 2006Q1   2007Q3 
;;;; 
proc print; 
    run; 
proc transpose data=have out=havet name=variable; 
    by city date notsorted; 
    var var:; 
    run; 
proc print; 
    run; 
proc summary data=havet nway missing; 
    class city variable; 
    where not missing(col1); 
    output out=want2(drop=_:) 
     idgroup(out(date)=first_nonmiss) 
     idgroup(last out(date)=last_nonmiss) 
     ; 
    run; 
proc print; 
    run; 
proc compare base=want compare=want2 listequalvars; 
    run;