Hallo zusammen, insbesondere Volker,
hier mein versprochenes zweites, 30h Problem
ich habe einen datensatz mit vier variablen und 1,3 mio fällen (als *txt, SPSS oder Statistica- file). die vierte variable beschreibt einen gerätezustand und hat bestimmte ausprägungen, die sich in unregelmäßigen abständen verändern, z.b.:
.
.
2040
2040
2060
2060
.
.
das problem besteht nun darin einen algorithmus zu schaffen, der diese sprünge in variable 4 erkennt und AB DIESER POSITION DIE 15 FOLGE-FÄLLE (ZEILEN) LÖSCHT.
es dürften zehntausende solcher sprüne vorhanden sein, der algorithmus muss also selbstständig weitersuchen...
ziemlich schwierig, hat jemand ideen?
danke und schön gruß,
lars
Fälle automatisch löschen
-
- Beiträge: 67
- Registriert: 17.01.2007, 18:15
Re: Fälle automatisch löschen
Hallo Lars,
endlich mal ein relativ leichtes Problem. ;-)
Noch kurz zum Verständnis:
Du hast also drei Teilprobleme:
1. Identifizieren der Sprünge innerhalb einer Variable.
2. Identifizieren der 15 Fälle nach einem Sprung.
3. Löschen der 15 identifizierten Fälle.
SPSS bietet ein paar sehr praktische Funktionen zur Transformierung von Zeitreihen. Diese können hier genutz werden.
************ Anfang SetUp ************.
* Erkennen von Sprüngen in der Variable V4.
* Dazu wird eine Variable Delta1 erstellt.
* In dieser Variable wird die Differenz der Werte aus der Variable V4 zwischen zwei aufeinanderfolgenden Fällen, bzw. Zeilen, berechnet.
* Positive Werte bedeuten, dass der entsprechende Fall in der Variable V4 einen höheren Wert enthält, als der vorangehende Fall.
create delta1 = diff(v4, 1).
exe.
* Identifizieren der folgenden 15 Fälle.
* Dazu werden die Werte aus delta1 fallversetzt in 15 neue Variablen geschrieben.
* Diese Variablen bekommen die Namen Delta2 bis Delta16.
create delta2 = lag(delta1, 1).
create delta3 = lag(delta1, 2).
create delta4 = lag(delta1, 3).
create delta5 = lag(delta1, 4).
create delta6 = lag(delta1, 5).
create delta7 = lag(delta1, 6).
create delta8 = lag(delta1, 7).
create delta9 = lag(delta1, 8).
create delta10 = lag(delta1, 9).
create delta11 = lag(delta1, 10).
create delta12 = lag(delta1, 11).
create delta13 = lag(delta1, 12).
create delta14 = lag(delta1, 13).
create delta15 = lag(delta1, 14).
create delta16 = lag(delta1, 15).
exe.
* Erstellen einer Löschvariable "Erase".
* Es wird davon ausgegangen, dass negative und positive Sprünge vorkommen können.
* Weiter wird davon ausgegangen, dass keine Sprünge < |1| vorkommen.
count erase = delta2 to delta16 (low thru -1, 1 thru high).
exe.
* Löschen der Fälle.
sel if (erase = 0).
exe.
* Speichern der neuen Datei im Stammverzeichnis.
* Bei "/keep " alle Variablen eintragen, die der neue Datensatz enthalten soll.
SAVE OUTFILE='C:\Test_erase2.sav'
/Keep id v4
/COMPRESSED.
************ Ende SetUp ************.
Also dann, bis zum nächsten mal.
Gruß, Volker
endlich mal ein relativ leichtes Problem. ;-)
Noch kurz zum Verständnis:
Der Fall mit dem Sprung selbst soll also nicht gelöscht werden? Wenn doch, musst du das SetUp entsprechend abändern.... und AB DIESER POSITION DIE 15 FOLGE-FÄLLE (ZEILEN) LÖSCHT
Du hast also drei Teilprobleme:
1. Identifizieren der Sprünge innerhalb einer Variable.
2. Identifizieren der 15 Fälle nach einem Sprung.
3. Löschen der 15 identifizierten Fälle.
SPSS bietet ein paar sehr praktische Funktionen zur Transformierung von Zeitreihen. Diese können hier genutz werden.
************ Anfang SetUp ************.
* Erkennen von Sprüngen in der Variable V4.
* Dazu wird eine Variable Delta1 erstellt.
* In dieser Variable wird die Differenz der Werte aus der Variable V4 zwischen zwei aufeinanderfolgenden Fällen, bzw. Zeilen, berechnet.
* Positive Werte bedeuten, dass der entsprechende Fall in der Variable V4 einen höheren Wert enthält, als der vorangehende Fall.
create delta1 = diff(v4, 1).
exe.
* Identifizieren der folgenden 15 Fälle.
* Dazu werden die Werte aus delta1 fallversetzt in 15 neue Variablen geschrieben.
* Diese Variablen bekommen die Namen Delta2 bis Delta16.
create delta2 = lag(delta1, 1).
create delta3 = lag(delta1, 2).
create delta4 = lag(delta1, 3).
create delta5 = lag(delta1, 4).
create delta6 = lag(delta1, 5).
create delta7 = lag(delta1, 6).
create delta8 = lag(delta1, 7).
create delta9 = lag(delta1, 8).
create delta10 = lag(delta1, 9).
create delta11 = lag(delta1, 10).
create delta12 = lag(delta1, 11).
create delta13 = lag(delta1, 12).
create delta14 = lag(delta1, 13).
create delta15 = lag(delta1, 14).
create delta16 = lag(delta1, 15).
exe.
* Erstellen einer Löschvariable "Erase".
* Es wird davon ausgegangen, dass negative und positive Sprünge vorkommen können.
* Weiter wird davon ausgegangen, dass keine Sprünge < |1| vorkommen.
count erase = delta2 to delta16 (low thru -1, 1 thru high).
exe.
* Löschen der Fälle.
sel if (erase = 0).
exe.
* Speichern der neuen Datei im Stammverzeichnis.
* Bei "/keep " alle Variablen eintragen, die der neue Datensatz enthalten soll.
SAVE OUTFILE='C:\Test_erase2.sav'
/Keep id v4
/COMPRESSED.
************ Ende SetUp ************.
Also dann, bis zum nächsten mal.
Gruß, Volker