Wie alle weiteren Zeitreihenbeobachtungen im Panel löschen???

Werbung
News
Artikel
Foren
Join
Projekte
List
Links
Random
Über Redscope
Previous
Next
Startseite › Foren › ETL & Base SAS
Wie alle weiteren Zeitreihenbeobachtungen im Panel löschen???
3 October, 2006 - 17:40 — Jipper
Erst einmal ein Hallo an die Redscope Community.
Ich habe da ein dringendes Problem, wo ich als SAS Neuling einmal die Hilfe von ein paar Veteranen
bräuchte. Vielleicht ist die Antwort auch ganz banal,aber ich hab jetzt schon 2 Tage nach einer
Antwort gesucht und drehe langsam durch.
Ich habe einen ganz normalen Panel-Datensatz für Firmen und
alles was ich will ist, dass alle Beobachtungen einer Firma gelöscht werden sobald in irgendeinem
Jahr in einer wählbaren Variable (z.B. EPS) ein Missing Value auftritt.
Nur um mein Problem zu verdeutlichen: Ich habe einen ganz normalen Panel-Datensatz mit
folgendem grobem Aufbau:
Obs__Firma_____year_..._EPS___...
-------------------------------_1___Firma A___2000_____2,3
_2___Firma A___2001_____0,3
_3___Firma A___2002_____1,7
...
_4___Firma B___2000_____7,9
_5___Firma B___2001_____ .
_6___Firma B___2002_____6,3
...
_7___Firma C___2000_____ .
_8___Firma C___2001_____ .
_9___Firma C___2002_____6,9
...
Im Beispiel müssten also alle Beobachtungen für Firma B und C gelöscht werden. Wie mach ich
das? Kann mir da jemand auf die Sprünge helfen?
Vielen Dank schon mal im voraus
Harm Schütt (neu im Forum)
Foren:
ETL & Base SAS
Log in or register to post comments
Lösung
Data Test;
set dateiname;
3 October, 2006 - 19:18 — MarcusPilz
*index gibt die Position des Suchstrings zurück;
* Feldname durch Name der Spalte ersetzen ;
if index(feldname,"Firma B") > 0 then delete;
if index(feldname,"Firma C") > 0 then delete;
Marcus Pilz
Projektleiter,
Produktverantwortung 'HV-Auswertungssysteme'
Commerzbank AG
Log in or register to post comments
Danke
3 October, 2006 - 23:26 — Jipper
Hey vielen Dank an Alle das hilft mir echt weiter.
Meine Hochachtung an die redscope community
Gruß
Harm Schütt
Log in or register to post comments
Es gibt verschiedene Möglichkeiten
3 October, 2006 - 23:03 — AndreasMangold
Wie immer gibt es verschiedene Lösungen.
Hier die verwendeten Beispieldaten:
/* Beispieldaten */
DATA EPS;
INPUT @6 Firma $7. +3 year 4. +5 EPS numx3.;
DATALINES;
_1___Firma A___2000_____2,3
_2___Firma A___2001_____0,3
_3___Firma A___2002_____1,7
_4___Firma B___2000_____7,9
_5___Firma B___2001_____ .
_6___Firma B___2002_____6,3
_7___Firma C___2000_____ .
_8___Firma C___2001_____ .
_9___Firma C___2002_____6,9
;
Lösung 1 löscht mit PROC SQL alle Sätze, bei denen es mindestens einen fehlenden Wert gibt. Es ist
wenig Programmcode nötig, sogar das Umkopieren kann man sich ja eigentlich sparen. Man erhält
allerdings eine Warung im Log, die man nach meiner Erfahrung ignorieren kann.
/* Lösung 1: Löschen der unerwünschten Sätze mit PROC SQL */
PROC SQL NOPRINT;
/* Kopie erstellen, nur wegen der weiteren Beispiele */
CREATE TABLE EPS1 AS
SELECT * FROM EPS;
/* unerwünschte Sätze löschen */
DELETE FROM EPS1 a WHERE EXISTS (
SELECT * FROM EPS1 b WHERE a.Firma=b.Firma AND b.EPS=.
);
QUIT;
Lösung 2 macht das Gegenteil von Lösung 1 und kopiert nur die erwünschten Sätze mit PROC SQL.
/* Lösung 2: nur erwünschte Sätze kopieren mit PROC SQL */
PROC SQL NOPRINT;
CREATE TABLE EPS2 AS
SELECT * FROM EPS a WHERE NOT EXISTS (
SELECT * FROM EPS b WHERE a.Firma=b.Firma AND b.EPS=.
)
;
QUIT;
Lösung 3 verwendet einen DATA-Schritt. Durch das Sortieren stehen die fehlenden Werte bei jeder
Firma vorne und in der Variablen MissingVorhanden merkt man sich, ob ein Missing da war und
löscht die entsprechenden Datensätze. Wichtig ist die RETAIN-Anweisung, damit der Wert von
MissingVorhanden zwischen den Durchgängen des DATA-Schritts nicht zurückgesetzt wird. Evtl. ist
es ein Nachteil, dass man die Originaldatei umsortieren muss.
/* Lösung 3: unerwünschte Sätze im DATA-Schritt löschen mit first/last-Verarbeitung */
PROC SORT DATA=EPS OUT=EPS3;
BY Firma EPS;
RUN;
DATA EPS3 (DROP=MissingVorhanden);
SET EPS3;
BY Firma;
RETAIN MissingVorhanden 0;
IF first.Firma AND EPS=. THEN MissingVorhanden=1;
IF MissingVorhanden THEN DO;
IF last.Firma THEN MissingVorhanden=0;
DELETE;
END;
RUN;
Lösung 4 ermittelt zunächst mit PROC MEANS die Firmen mit fehlenden Werten und im DATASchritt werden diese dann gelöscht. Auch hier muss umsortiert werden.
/* Lösung 4: unerwünschte Sätze im DATA-Schritt löschen mit MERGE */
PROC MEANS DATA=EPS NWAY NOPRINT;
CLASS Firma;
VAR EPS;
OUTPUT OUT=EPSMissing (WHERE=(EPS>0)) NMISS=;
RUN;
PROC SORT DATA=EPS OUT=EPS4;
BY Firma;
RUN;
DATA EPS4;
MERGE EPS4 EPSMissing (KEEP=Firma IN=MitMissing);
BY Firma;
IF MitMissing THEN DELETE;
RUN;
Log in or register to post comments
Herunterladen