unzählige if-bedingungen
-
Barcelona
- Beiträge: 6
- Registriert: 02.05.2012, 09:18
unzählige if-bedingungen
Liebes Forum
Gibt es in SPSS eine Verschachtelungsmöglichkeit bei den if-Bedingungen, wenn wir unzählige Variablenwerte haben? Wir haben pro Fall je 54 Variablen in denen der Status ausgegeben wird und dazu 54 Variablen in denen das Bezugsjahr ausgegeben wird. Die Variable Status1 und Jahr1 gehören zusammen, Status2 zu Jahr2 etc. In der Statusvariable gibt es 6 unterschiedliche Werte (1-6), bei der Jahresvariable 3 unterschiedliche Werte (10, 11, 12). Wir haben ca. 35‘000 Fälle und müssen nun für alle Kombinationen eine if-Bedingung schreiben:
if (Status1 EQ 5 and Jahr.1 eq 11) TN11 =1.
Zum Schluss müssen wir die, in der if-Bedingung erfüllten Werte, addieren.
Wenn wir die Syntax so schreiben müssen, wird die Syntax unglaublich lang – es gibt doch sicher eine schlankere und elegantere Art?!?
Als Beispiel hier ein abgekürzter Auszug (S für Satus und J für Jahr):
S1 S2 S3 S4 S5 J1 J2 J3 J4 J5
1 2 5 6 0 10 11 11 11 0
5 3 2 5 6 10 10 10 11 11
3 2 1 0 0 11 11 11 0 0
4 0 0 0 0 10 0 0 0 0
5 5 5 5 5 11 11 11 11 11
2 6 3 0 0 12 12 12 0 0
5 1 4 4 4 10 10 10 10 10
5 0 0 0 0 11 0 0 0 0
1 2 0 0 0 10 11 0 0 0
Hat jemand eine Idee wie wir das lösen können?
Danke für eure Hilfe!
Liebe Grüsse
Barcelona
Gibt es in SPSS eine Verschachtelungsmöglichkeit bei den if-Bedingungen, wenn wir unzählige Variablenwerte haben? Wir haben pro Fall je 54 Variablen in denen der Status ausgegeben wird und dazu 54 Variablen in denen das Bezugsjahr ausgegeben wird. Die Variable Status1 und Jahr1 gehören zusammen, Status2 zu Jahr2 etc. In der Statusvariable gibt es 6 unterschiedliche Werte (1-6), bei der Jahresvariable 3 unterschiedliche Werte (10, 11, 12). Wir haben ca. 35‘000 Fälle und müssen nun für alle Kombinationen eine if-Bedingung schreiben:
if (Status1 EQ 5 and Jahr.1 eq 11) TN11 =1.
Zum Schluss müssen wir die, in der if-Bedingung erfüllten Werte, addieren.
Wenn wir die Syntax so schreiben müssen, wird die Syntax unglaublich lang – es gibt doch sicher eine schlankere und elegantere Art?!?
Als Beispiel hier ein abgekürzter Auszug (S für Satus und J für Jahr):
S1 S2 S3 S4 S5 J1 J2 J3 J4 J5
1 2 5 6 0 10 11 11 11 0
5 3 2 5 6 10 10 10 11 11
3 2 1 0 0 11 11 11 0 0
4 0 0 0 0 10 0 0 0 0
5 5 5 5 5 11 11 11 11 11
2 6 3 0 0 12 12 12 0 0
5 1 4 4 4 10 10 10 10 10
5 0 0 0 0 11 0 0 0 0
1 2 0 0 0 10 11 0 0 0
Hat jemand eine Idee wie wir das lösen können?
Danke für eure Hilfe!
Liebe Grüsse
Barcelona
-
Generalist
- Beiträge: 1733
- Registriert: 11.03.2010, 22:28
Man könnte mit "Datei umstrukturieren" (Variablen zu Fällen) aus den
beiden Variablengruppen à 54 Variablen 2 Variablen machen, jeder
bisherige Fall würde dabei 54 Zeilen umfassen (dabei kann man eine
Index-Variable 1 bis 54 anfordern). Die Variable TN wäre dann mit
den 3*6 IF statements zu bilden. Schlußendlich dann wieder Fälle zu
Variablen.
In derselben Zeit könnte man allerdings auch einmal die 3*6 Statements
schreiben und das 54mal kopieren und mit "Ersetze" 53mal den Index
ersetzen. Ist zwar stupide, aber geht (wobei eine Indexzahl natürlich
eindeutig erkennbar sein muss, also nicht S1 S2 S3, sondern z.B. S.1
S.2 S.3).
beiden Variablengruppen à 54 Variablen 2 Variablen machen, jeder
bisherige Fall würde dabei 54 Zeilen umfassen (dabei kann man eine
Index-Variable 1 bis 54 anfordern). Die Variable TN wäre dann mit
den 3*6 IF statements zu bilden. Schlußendlich dann wieder Fälle zu
Variablen.
In derselben Zeit könnte man allerdings auch einmal die 3*6 Statements
schreiben und das 54mal kopieren und mit "Ersetze" 53mal den Index
ersetzen. Ist zwar stupide, aber geht (wobei eine Indexzahl natürlich
eindeutig erkennbar sein muss, also nicht S1 S2 S3, sondern z.B. S.1
S.2 S.3).
-
Barcelona
- Beiträge: 6
- Registriert: 02.05.2012, 09:18
Hallo Generalist
Danke für deine Antwort. Diese Datei ist bereits 'umstrukturiert' - ich brauche die Daten leider in dieser Form (mit 35'000 Fällen), weil ich die 'Teilnehmenden' (TN) auch nach Anzahl Unique-Teilnehmenden auswerten muss. Ich muss also am Schluss wissen, wie viele (TN) hatten wir in den 3 Jahren in unseren Kursen und wie viele sind mehrmals bei uns gewesen und wie viele davon sind Uniques - und dazu noch nach dem Status (teilnehmend, abgewiesen, warteliste, ...) . So viel zur Datenbank.
Mit Index - wenn ich es recht verstehe - komme ich also nicht weiter.
Dein Tipp 'In derselben Zeit könnte man allerdings auch einmal die 3*6 Statements schreiben und das 54mal kopieren..' werde ich wohl machen müssen.
merci und gruss, wanda
Danke für deine Antwort. Diese Datei ist bereits 'umstrukturiert' - ich brauche die Daten leider in dieser Form (mit 35'000 Fällen), weil ich die 'Teilnehmenden' (TN) auch nach Anzahl Unique-Teilnehmenden auswerten muss. Ich muss also am Schluss wissen, wie viele (TN) hatten wir in den 3 Jahren in unseren Kursen und wie viele sind mehrmals bei uns gewesen und wie viele davon sind Uniques - und dazu noch nach dem Status (teilnehmend, abgewiesen, warteliste, ...) . So viel zur Datenbank.
Mit Index - wenn ich es recht verstehe - komme ich also nicht weiter.
Dein Tipp 'In derselben Zeit könnte man allerdings auch einmal die 3*6 Statements schreiben und das 54mal kopieren..' werde ich wohl machen müssen.
merci und gruss, wanda
-
Barcelona
- Beiträge: 6
- Registriert: 02.05.2012, 09:18
@drfg2008
damit habe ich angefangen - aber mit do if...else if... brauche ich trotzdem unzählige 'else ifs':
Do if (Status1 EQ 5 and Jahr.1 eq 11).
compute j11_1TN=1.
else if (Status1 NE 5 and Jahr.1 NE 11).
compute j11_1TN=0.
End if.
EXECUTE.
Do if (Status2 EQ 5 and Jahr.2 eq 11).
compute j11_2TN=1.
else if (Status2 NE 5 and Jahr.2 NE 11).
compute j11_2TN=0.
End if.
EXECUTE.
Vom Status1 gibt es 6 Möglichkeiten, vom Jahr1 3 Möglichkeiten, also 18 do if-else if - und das ganze bis und mit Status 54, macht 972 do if else if....
Gibt es bei Do if keine Möglichkeit zu schreiben
Do if (Status1 to Status54 EQ 5 and Jahr.1 eq 11).
Danke und Gruss, Wanda
damit habe ich angefangen - aber mit do if...else if... brauche ich trotzdem unzählige 'else ifs':
Do if (Status1 EQ 5 and Jahr.1 eq 11).
compute j11_1TN=1.
else if (Status1 NE 5 and Jahr.1 NE 11).
compute j11_1TN=0.
End if.
EXECUTE.
Do if (Status2 EQ 5 and Jahr.2 eq 11).
compute j11_2TN=1.
else if (Status2 NE 5 and Jahr.2 NE 11).
compute j11_2TN=0.
End if.
EXECUTE.
Vom Status1 gibt es 6 Möglichkeiten, vom Jahr1 3 Möglichkeiten, also 18 do if-else if - und das ganze bis und mit Status 54, macht 972 do if else if....
Gibt es bei Do if keine Möglichkeit zu schreiben
Do if (Status1 to Status54 EQ 5 and Jahr.1 eq 11).
Danke und Gruss, Wanda
-
Barcelona
- Beiträge: 6
- Registriert: 02.05.2012, 09:18
@Bert
Danke für Hinweis mit Schleife: was ich dort nicht verstehe ist, wie ich nur gewisse Variablen eingeben kann, die geloopt werden sollen??
LOOP #i=1 TO 5 .
COMPUTE count = count + 1 .
END LOOP .
habe mal noch folgende Syntax gefunden, aber auch die läuft irgendwie nicht:
NUMERIC teilnehmend1 to teilnehmend5.
Do repeat a =t1n to tn5.
+ Compute a=0.
End repeat.
Vector x=Status1_kat to Status5_kat / y=Jahr.1 to Jahr.5 /z=tn1 to tn5.
Loop #i=1 to 5.
+ IF (x eq 5) z(x-9)=z(x-9)+1.
End Loop.
Kannst du mir weiterhelfen?
Danke und lieber Gruss, Wanda
Danke für Hinweis mit Schleife: was ich dort nicht verstehe ist, wie ich nur gewisse Variablen eingeben kann, die geloopt werden sollen??
LOOP #i=1 TO 5 .
COMPUTE count = count + 1 .
END LOOP .
habe mal noch folgende Syntax gefunden, aber auch die läuft irgendwie nicht:
NUMERIC teilnehmend1 to teilnehmend5.
Do repeat a =t1n to tn5.
+ Compute a=0.
End repeat.
Vector x=Status1_kat to Status5_kat / y=Jahr.1 to Jahr.5 /z=tn1 to tn5.
Loop #i=1 to 5.
+ IF (x eq 5) z(x-9)=z(x-9)+1.
End Loop.
Kannst du mir weiterhelfen?
Danke und lieber Gruss, Wanda
-
Generalist
- Beiträge: 1733
- Registriert: 11.03.2010, 22:28
-
drfg2008
- Beiträge: 2391
- Registriert: 06.02.2011, 19:58
re
Ganz nebenbei: Falls man nicht weiterkommt, hilft eine sehr unelegante, aber immer wieder zuverlässige Methode. Mit Excel sich diese Statements zusammenbasteln. Da würde ich glatt ein Zehnfaches mit hinbekommen. In wenigen Minuten. Darf nur niemand sehen ; -)und das ganze bis und mit Status 54, macht 972 do if else if....
drfg2008
-
Bert
- Beiträge: 42
- Registriert: 01.09.2011, 17:10
Hallo Wanda,
versuche mal bitte folgendes. Bringe zunächst die Variablen in folgende Form status_1 bis status_54, und jahr_1 bis jahr_54.
Für eine Loop muß die Zahl am Ende stehen. Zumindestens sind mir damit immer die Loops gelungen.
Anschließend in der Syntax folgendes eingeben:
vector stat = status_1 to status_54.
vector jahr= jahr_1 to jahr_54.
compute aufsum=0.
loop #k = 1 to 54.
if (stat(#k)=5 and jahr(#k) =11) TN11=1.
if (TN11=1) compute aufsum=aufsum+1.
end loop.
execute.
Viele Grüße,
Bert
versuche mal bitte folgendes. Bringe zunächst die Variablen in folgende Form status_1 bis status_54, und jahr_1 bis jahr_54.
Für eine Loop muß die Zahl am Ende stehen. Zumindestens sind mir damit immer die Loops gelungen.
Anschließend in der Syntax folgendes eingeben:
vector stat = status_1 to status_54.
vector jahr= jahr_1 to jahr_54.
compute aufsum=0.
loop #k = 1 to 54.
if (stat(#k)=5 and jahr(#k) =11) TN11=1.
if (TN11=1) compute aufsum=aufsum+1.
end loop.
execute.
Viele Grüße,
Bert
-
Barcelona
- Beiträge: 6
- Registriert: 02.05.2012, 09:18
Lieber BertBert hat geschrieben:Hallo Wanda,
versuche mal bitte folgendes. Bringe zunächst die Variablen in folgende Form status_1 bis status_54, und jahr_1 bis jahr_54.
Für eine Loop muß die Zahl am Ende stehen. Zumindestens sind mir damit immer die Loops gelungen.
Anschließend in der Syntax folgendes eingeben:
vector stat = status_1 to status_54.
vector jahr= jahr_1 to jahr_54.
compute aufsum=0.
loop #k = 1 to 54.
if (stat(#k)=5 and jahr(#k) =11) TN11=1.
if (TN11=1) compute aufsum=aufsum+1.
end loop.
execute.
Viele Grüße,
Bert
Danke, habe es gerade ausprobiert, die Variablen umbenannt. Bei mir kam eine Fehlermeldung bei Zeile: if (TN11=1) compute aufsum=aufsum+1.
Es fehle ein =.
Habs nun so geschrieben:
if (TN11=1) compute = aufsum=aufsum+1.
So läuft es durch. Damit gibt er die 3 Variablen aus, aber leider falsch:
(1.=aufsum, 2.=TN11, 3.=compute)
.00 1.00 .00
.00 1.00 .00
.00
.00
.00 1.00 .00
.00
.00
.00 1.00 .00
.00
-
Bert
- Beiträge: 42
- Registriert: 01.09.2011, 17:10
-
Barcelona
- Beiträge: 6
- Registriert: 02.05.2012, 09:18
Danke, habs mit einer und mit 2 schleifen getestet, es gibt das gleiche resultat - ein falschesBert hat geschrieben:Sorry, die Zeile fürs aussummieren sollte so lauten. Einfach das 'compute' raus nehmen
if (TN11=1) aufsum=aufsum+1.
Und wenn das zusammen nicht in einer Schleife klappt, dann nach dem execute-Befehl noch mal eine Schleife einfügen nur mit dem hochzählen.
Grüße,
Bert
paste dir mal die ausgabe rein: vorletzte zahl ist 'aufsum' und letzte 'tn11'. aufsum sollte auf 8 sein, ist aber auf 5.
1 2 5 6 0 10 11 11 11 0 5 1
5 3 2 5 6 10 10 10 11 11 5 1
3 2 1 0 0 11 11 11 0 0 0 0
4 0 0 0 0 10 0 0 0 0 0 0
5 5 5 5 5 11 11 11 11 11 5 1
2 6 3 0 0 12 12 12 0 0 0 0
5 1 4 4 4 10 10 10 10 10 0
5 0 0 0 0 11 0 0 0 0 5 1
1 2 0 0 0 10 11 0 0 0 0 0
viele grüsse, wanda



