2017-08-09 6 views
0

ich folgende PROC SQL Schritt bin mit Daten ziehen:SAS - ausgewogene Paneldatensatz mit proc sql

PROC SQL; 

create table panel as 
select ID, Month, Var1, Var2, Var3 
from data 
order by ID, Month; 
quit; 

Ich möchte die Daten verwenden, um eine ausgewogene Paneldaten zu bauen, aber es wird IDs fehlen, was bedeutet, dass der Wert für jede Variable für jeden Monat gleich Null ist.

Ich kann nicht herausfinden, wie ich eine Abfrage oder irgendwelche Datenschritte schreiben kann, die die fehlenden IDs in den Datensatz für jeden Monat einfügen und dann Nullen als Werte geben.

Zum Beispiel meiner Abfrage wird die folgende Tabelle machen:
UNBALANCED PANEL

Mein Problem ist, dass es ein ID „A“ das ist nicht in den Daten repräsentiert, die ich ziehen, aber ID A“ " existiert. Um die Komplexität zu erhöhen, erscheint die ID "C" im PROC-SQL-Intervall zeitweise und nicht auf monatlicher Basis, aber ich möchte sie als Nullen für jeden Monat anzeigen, der nicht in der Datenbank erscheint. Daher versuche ich, fehlende Daten für bekannte IDs für jeden Monat und mit Nullen für jeden Var zu haben.

Zum Beispiel:
BALANCED PANEL

Das bin ich seit ein paar Wochen stumping und wenn jemand irgendwelche Erkenntnisse hat dann wäre es sehr zu schätzen!

+0

Anstatt uns alle zu fragen, was ein ausgewogener Panel-Datensatz ist, könnten Sie ihn kurz definieren –

Antwort

0

Dies wird nicht die eleganteste Lösung, aber es nutzt grundlegenden Code, der leicht zu verstehen:

1) Gibt einen Datensatz werden alle bekannten IDs und Monate

data ids; 
infile datalines; 
input ID $; 
month='Jan'; output; 
month='Feb'; output; 
month='Mar'; output; 
month='Apr'; output; 
month='May'; output; 
month='Jun'; output; 
month='Jul'; output; 
month='Aug'; output; 
month='Sep'; output; 
month='Oct'; output; 
month='Nov'; output; 
month='Dec'; output; 
datalines; 
A 
B 
C 
D 
; 
run; 

(dieses Beispiel statisch ist als ich weiß nicht, Ihre Daten aber wenn man sie von irgendwo ziehen kann, zB select distinct ID, Month from table, es ist natürlich viel besser)

2) Haben Ihre proc sql, wie Sie tat:

proc sql; 
create table panel as 
select ID, Month, Var1, Var2, Var3 
from data 
order by ID, Month; 
quit; 

3) Dann rechts Ihr Ergebnis mit der „Tabelle von Nullen beitreten zu

proc sql; 
create table panel_balanced as 
select coalesce(t1.ID,t2.ID) as ID 
     ,coalesce(t1.Month,t2.Month) as Month 
     ,coalesce(t1.var1,0) as var1 
     ,coalesce(t1.var2,0) as var2 
     ,coalesce(t1.var3,0) as var3 
from panel t1 
right join ids t2 
    on t1.ID=t2.ID 
    and t1.Month=t2.Month 
; 
quit; 

die Datensätze für die‚fehlenden IDs‘erhalten Sie natürlich Schritt 2 und 3 in einer Abfrage kombinieren oder sogar tun Das Ganze in einer SQL-Abfrage, wenn die Tabelle aus Schritt 1 auch mit SQL erstellt werden kann.