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