<< Click to Display Table of Contents >> Navigation: Datenmodifikation > Berechnung > Compute |
Der Funktionskomplex rund um das COMPUTE-Statement ermöglicht die Umformung von Variablen bzw. deren Werteausprägungen.
Ergebnis eines COMPUTE-Befehls ist stets eine Zielvariable: Diese kann eine bestehende oder bisher nicht existente Variable sein. Wenn eine Zielvariable in einem COMPUTE-Statement nicht existiert, wird automatisch eine Variable dieses Namens erzeugt - im Standardfall eine atomare Variable. Als zusätzliche 'bequeme' Automatik wird bei COMPUTE LOAD etc. die Zielvariable nach dem Muster der Quelle erzeugt, wenn diese aus nur einer Variablen besteht, z.B. also eine MultiQ für 10 Nennungen. Soll aber beispielsweise eine OPEN-Varriable oder eine ASSOCVAR in eine neue, nicht existierende Variable computet werden, besteht die Problematik, dass es für die zu generierende Variable kein Muster gibt: es ist z.B. nicht bekannt, wieviele Codes in einer OPEN-Variable oder ASSOCVAR drinstecken. Mit der standardweise generierten atomaren Variablen könnten also Werte unbemerkt verlorengehen. An dieser Stelle generiert GESStabs einen Syntaxfehler. Es ist dann Aufgabe der/s Benutzers/in, eine passende Variable zur Verfügung zu stellen.
Die Zielvariable gilt in der Folge als die "aktuelle" Variable. Auf diese Variable beziehen sich die folgenden Anweisungen, die keine expliziten Variablenlisten enthalten, wie z.B. VALUELABELS, RECODE, PRINTALL etc..
Neben dem ursprünglichen, mit mathematischen Funktionen rechnenden COMPUTE-Statement existieren in GESStabs folgende Varianten des COMPUTE:
COMPUTE |
Neuberechnung atomarer Variablen |
---|---|
COMPUTE ADD |
Ergänzende Speicherung definierter Werte |
COMPUTE ALPHA |
Verknüpfung von String-Elementen |
COMPUTE ASCEND/DESCEND |
Sortierung der Werte (vor deren Übertrag in Zielvariable) |
COMPUTE CONCAT |
Verkettung von Labels und Textkonstanten |
COMPUTE COPY |
Kopieren von Variablenbereichen |
COMPUTE ELIMINATE |
Löschen einer definierten Wertemenge |
COMPUTE INIT |
Übertrag einer definierten Wertemenge |
COMPUTE LOAD |
Abbildung von Werten/-mengen zwischen verschiedenen Darstellungsformen (z.B. Variablentypen) |
COMPUTE REPLACE |
|
COMPUTE SHUFFLE |
Variante von COMPUTE LOAD, aber mit variablenweise, zufällig sortierten Werten |
COMPUTE SORT |
Variante von COMPUTE LOAD, mit der Prioritätsreihenfolge für Übernahme von Werten angegeben werden kann |
COMPUTE SUBSTR |
|
COMPUTE SWAP |
Austausch von Werten zwischen Variablen (wechselseitiges COMPUTE COPY) |
In den folgenden Menüs werden die verschiedenen Möglichkeiten der Umformung gezeigt:
COMPUTE erlaubt die Neuberechnung von Variablen mittels der vier Grundrechenarten: + - / * Dabei können neue Variablen definiert oder bereits bestehende im ihrem Wert geändert werden. Syntax: COMPUT <result> = <arithmetic_expressiom>; Steht im linken Ausdruck eines COMPUTE-Statements (Zielvariable) eine Variable, die das Programm noch nicht kennt, wird automatisch eine Variable dieses Namens erzeugt. Beispiel: COMPUTE Einkommen = einkommen1 + einkommen2; COMPUTE Mittel = ( var1 + var2 ) / 2; Die Vorrangregel "Punktrechnung geht vor Strichrechnung" gilt. Das Ergebnis der Berechnung soll i.d.R. in einer Variablen gespeichert werden, es ist aber auch die Angabe mehrerer Zielvariablen zulässig - dann werden all diese Variable auf den angegebenen Wert gesetzt. Beispiel: COMPUTE a b c = 0; ist erlaubt. Mathematische Funktionen Innerhalb von COMPUTE-Statements kann man für mathematische Umformungen Funktionen verwenden. Im System sind folgende Funktionen bekannt:
Beispiel: COMPUTE x = ENTIER( NEG( b / 2 ) ); Arithmetische Operatoren für Ganze Werte Auch wenn GESStabs keine echten Ganzen Werte kennt, kann es interessant sein, den "Rest" einer Division zu kennen. Dazu stehen folgende Operatoren bereit:
D.h. 3.5 DIV 3 ergibt 1 (trunc( 3.5 ) = 3) 3.5 MOD 3 ergibt 0 (trunc( 3.5 ) = 3) 3 MOD 3.5 ergibt 1 (trunc( 3.5 ) = 3) 2.999999 DIV 3 ergibt 0 (trunc( 2.999999 ) = 2) Kombinationen von / und * mit DIV und MOD muss man explizit klammern: die Ausführungsreihenfolge ist sonst undefiniert. Einbezug von ALPHA-Variablen Für den Einbezug von Alpha-Variablen in Berechnungen, siehe Umformung nicht-COMPUTE-fähiger Variablen. FCompute Parallel und funktionsgleich zum COMPUTE-Statement gibt es FCOMPUTE. Syntax: FCOMPUTE <varname> .... Unterschied bzw. Erweiterung zu COMPUTE: FCOMPUTE überprüft die mit SETFILTER gesetzten Filter und wird nur dann ausgeführt, wenn alle Filterbedingungen wahr sind, bzw. wenn kein Filter gesetzt ist. Analoge Erweiterung zum FIF-Statement. |
Syntax: COMPUTE ADD <zielvar> = <varlist>; Beide Variablenlisten müssen dieselbe Anzahl an Elementen haben. Anstelle einer Variablenliste kann auch eine MultiQ gesetzt werden - diese muss dann ebenfalls die passende Zahl an Elementen enthalten. |
Syntax: COMPUTE ALPHA <alphavar> = [ <variable> | <string> ]; COMPUTE ALPHA verknüpft String-Variablen miteinander. Die Zielvariable muss vom Typ ALPHA sein. Der Zielvariablen wird ein numerischer Wert zugewiesen, der dem Alphatext der Quellvariablen entspricht. Ist die Quellvariable eine atomare Variable, wird überprüft, ob es für den jeweiligen Wert ein Label gibt; wenn ja, wird dieser Text in die Zielvariable übertragen. Existiert die Zielvariable noch nicht, wird eine neue Variable vom Typ ALPHA generiert. Beide Variablenlisten müssen dieselbe Anzahl an Elementen haben. Anstelle einer Variablenliste kann auch eine MultiQ gesetzt werden - diese muss dann ebenfalls die passende Zahl an Elementen enthalten. |
Compute Ascend, Compute Descend
Syntax: COMPUTE [ ASCEND | DESCEND ] <varlist> = <varlist>; COMPUTE LOAD überträgt die Werte in genau der Reihenfolge, wie sie in der Quelle vorgefunden werden. Mit COMPUTE ASCEND bzw. DESCEND wird die Wertemenge erst aufsteigend bzw. absteigend sortiert, bevor sie in die Zielvariable eingetragen wird. Beide Variablenlisten müssen dieselbe Anzahl an Elementen haben. Anstelle einer Variablenliste kann auch eine MultiQ gesetzt werden - diese muss dann ebenfalls die passende Zahl an Elementen enthalten. |
Syntax: COMPUTE CONCAT [ <lettercase> ] <alphavar> = { <elem> }*n; <lettercase> ::= [ LOWERCASE | UPPERCASE ] Mit COMPUTE CONCAT kann man die Labels von beliebig vielen atomaren Variablen mit Textkonstanten verketten. Die Variablen als Argumente müssen atomare Variablen sein. Ob es sich um ALPHA-Variablen handelt, ist dabei unerheblich. Für alle Variablen wird der Text des Labels verwendet, der dem aktuellen Wert entspricht. Beispiel: COMPUTE CONCAT neuevar = "aktuelles Label von Variable q1" q1 "und aktuelles Label von Variable q2" q2; Vorschlag: „Ein String, der keinem Variablennamen entspricht, wird als Textkonstante betrachtet und so eingefügt. Gibt es zum gegenwärtigen Wert einer existierenden Variablen kein Label (kann bei Alpha-Variablen nicht der Fall sein), wird ein leerer String verwendet. Man kann außerdem bestimmen, dass das Ergebnis in Groß- (UPPERCASE) oder Kleinbuchstaben (LOWERCASE) gewandelt werden soll. CONCAT kann auch als COMPUTE-Spezifikation in IF-Statements und deren ELSE-Komponente verwendet werden. Ein Beispiel: IF [ 2 3 ] IN x7 THEN CONCAT neue = 'aa' '-' 'bb' '-' xx1 '-' x5 ELSE CONCAT neue = 'xx' '-' 'yy' '-' xx1 '-' x5; Übersichtlicher ist oft die Verwendung von IFBLOCK/ELSEBLOCK/ENDBLOCK anstelle von IF/ELSE: IFBLOCK [ 2 3 ] IN x7 THEN COMPUTE CONCAT neue = 'aa' '-' 'bb' '-' xx1 '-' x5; COMPUTE SUBSTR PART = neue 1 20; ELSEBLOCK COMPUTE CONCAT neue = 'xx' '-' 'yy' '-' xx1 '-' x5; COMPUTE SUBSTR part = neue 1 10; ENDBLOCK; Variablen-Eigenschaft ConcatNumToStr Syntax: CONCATNUMTOSTR <varlist> = [ YES | NO ]; Default: NO Als Default werden numerische atomare Variablen als Argumente in einem COMPUTE CONCAT-Statement als leerer String abgebildet, wenn dem aktuellen numerischen Wert kein Valuelabel zugeordnet ist. Hat die Variable die Eigenschaft CONCATNUMTOSTR, wird der aktuelle numerische Wert als String dargestellt, hierbei werden DECIMALS berücksichtigt. Ist die Variable MISSING, wird der Text "M" eingefügt. Damit können auch ungelabelte numerische Werte in zusammensetzte ALPHA-Variablen eingebaut werden. Außerhalb von COMPUTE CONCAT hat CONCATNUMTOSTR keine Auswirkungen; die Variablen in der "<varlist>" bleiben numerisch und werden nicht ALPHA, d.h. man kann weiter mit ihnen rechnen. |
Mit COMPUTE COPY können ganze Variablenbereiche kopiert werden. Syntax: COMPUTE COPY <varlist> = <varlist>; Z.B.: COMPUTE COPY v1 TO v27 = x1 TO x20, item1 TO item7; Beide Variablenlisten müssen dieselbe Anzahl an Elementen haben. Anstelle einer Variablenliste kann auch eine MultiQ gesetzt werden - diese muss dann ebenfalls die passende Zahl an Elementen enthalten. Dies bietet auch die Möglichkeit, Variablen mit Mehrfachnennungen (VARGROUP, GROUPS, DichoQ, VARFAMILY und FAMILIYVAR) zuzuweisen, mit denen man nicht arithmetisch rechnen kann. Anstelle der VARLIST v1 TO v27 dürfte im obigen Beispiel z.B. auch eine VARGROUP aus 27 Einzelvariablen stehen. Steht rechts vom Zuweisungszeichen eine gefilterte Variable, und ist der Filter ungültig, wird links in die entsprechende Variable der SystemMissing-Wert abgelegt (siehe SETMISSING). Beachte: Eine Zielvariable muss vom Typ ALPHA sein muss, wenn dies bei der Quellvariable der Fall ist. Im Falle einzelner Variablen sollte zugunsten semantischer Klarheit explizit mit COMPUTE ALPHA gearbeitet werden. Soll eine Liste von ALPHA-Variablen kopiert werden, kann COMPUTE COPY aber handlich sein. |
Syntax: COMPUTE ELIMINATE <zielvar> = { <number> }*n; Hiermit werden alle Werte aus einer konstanten Wertemenge in der Zielvariable gelöscht. |
Syntax: COMPUTE INIT <zielvar> = { <number> }*n; Hiermit wird eine konstante Wertemenge in die Zielvariable übertragen, die sinnvollerweise eine VarFamily sein sollte. |
Syntax: COMPUTE LOAD <zielvar> = <varlist> ; Zielvariable: eine SingleQ, VarFamily oder VarGroup Mit COMPUTE LOAD kann man Werte und Wertemengen zwischen verschiedenen Darstellungsformen abbilden. Eine häufige Anwendung ist die Abbildung einer offenen Frage (Einfachnennungsvariable mit der Eigenschaft OPEN) in eine Mehrfachnennungsvariable (VarFamily oder VarGroup), wie z.B. in der folgenden Sequenz: SINGLEQ offen = TITLE "Offene Frage" OPEN; MAKEFAMILY f_offen = 10; COMPUTE LOAD f_offen = offen; Im Anschluss ist der Inhalt der offenen Frage wie jede andere VarFamily manipulierbar, z.B. für RECODE etc.. Man kann aber auch eine VarFamily in eine VarGroup abbilden und umgekehrt, z.B. wenn man einen Outfile mit festgelegter Kodierung bilden muss. Z.B.: MULTIQ ff = 10 2 labels 1 "Label 1" ... 30 "Label 30" ; MAKEGROUP G = 30; COPYLABELS g = f; COMPUTE LOAD g = f; Wenn COMPUTE LOAD nur eine Variable als Argument hat, und die Zielvariable existiert noch nicht, dann wird die Zielvariable strukturgleich zur Argumentvariablen erzeugt. COMPUTE LOAD und OVERCODE Ist bei einer Variablen ein Overcode definiert, werden die Overcodes als synthetische Werte bei COMPUTE LOAD mit übertragen: ein COMPUTE LOAD überträgt alle Werte, die eine Variable sonst z.B. an einen Tabellenauswertungsteil übermitteln würde. Anders bei COMPUTE COPY: hier werden nur die 'echten' Werte übertragen. |
Syntax: COMPUTE REPLACE <value to replace> <zielvar> = <sourcevar>; Vereinfacht die Vearbeitung von nachträglich kodierten offenen Fragen, die einen bestehenden Codeplan ergänzen sollen. Das Szenario: Man hat eine Frage Q10a mit x Antwortvorgaben, und bei Code 97 "Sonstige, und zwar..." sind nachträglich die Nennungen kodiert worden, die in einer OpenQ mit dem Namen Q10a_97 abgelegt sind. Mit COMPUTE REPLACE 97 Q10a = Q10a_97; würde folgendes erreicht: Wenn die Wertemenge in Q10a_97 leer ist, oder Q10a den Code 97 nicht enthält, passiert gar nichts; der Code 97 bleibt in Q10a erhalten. Andernfalls wird Code 97 entfernt, und die Wertemenge aus Q10a_97 wird in Q10a zugefügt, wie bei COMPUTE ADD. |
Wie COMPUTE LOAD, nur werden die Werte der Quellvariablen variablenweise nach Zufall sortiert. Wird i.d.R. bei Fragebogen-Programmierung benötigt. Syntax: COMPUTE SHUFFLE <varlist> = <varlist>; Beide Variablenlisten müssen dieselbe Anzahl an Elementen haben. Anstelle einer Variablenliste kann auch eine MultiQ gesetzt werden - diese muss dann ebenfalls die passende Zahl an Elementen enthalten. Zum Beispiel COMPUTE SHUFFLE liste = oldliste; legt in "<liste>" eine Zufallsreihenfolge der in "<oldliste>" gespeicherten Werte ab. Ist "<liste>" eine atomare Variable, kann man auch einen Wert aus einer Menge nach Zufall selektieren. Auch Auswahlen "3 aus 6" o.ä. sind damit leicht zu bewerkstelligen. Zum Beispiel: MAKEFAMILY neu = 3; COMPUTE SHUFFLE neu = alt; |
Syntax: COMPUTE SORT ( n1 n2 ... nm ) <zielvar> = <quellvar>; Zielvariable: eine SingleQ, VarFamily oder VarGroup COMPUTE SORT ist eine spezielle Variante des COMPUTE LOAD-Konstrukts. Bei einer Abbildung in eine VarFamily kann der Fall auftreten, dass nicht alle Nennungen aufgenommen werden können. Wenn z.B. eine VarFamily nur drei Nennungen erlaubt, in einer VarGroup aber fünf Einzelitems "An" sind, dann entsteht ein Überlauf. Nachdem drei Nennungen in der VarFamily abgelegt sind, werden weitere Nennungen nicht mehr übernommen und werden ignoriert. Mit COMPUTE SORT kann man nun eine Prioritätsreihenfolge angeben, in der die Werte übernommen werden sollen. VARFAMILY f = f.1 TO f.3; COMPUTE SORT ( 2 3 6 7 1 0 ) f = g; Enthält die Variable g die Wertemengen 2, 4, 5, 7 und 10, dann wird erst die 2, dann die 7 übertragen. Die Werte 4, 5 und 10 sind nicht in der Prioritätenliste enthalten und werden nicht übertragen. |
Syntax: COMPUTE SUBSTR [ <lettercase> ] <zielvariable> = <quellvariable> <start> <len> ; Kopiert wird ein Substring der Länge "<len>" ab der Position "<start>". Die Bezeichnung der Länge und Startposition beziehen sich auf die Logik von ASCII-Datensätzen. Das Ergebnis kann kürzer sein als "<len>", und ggf. die Länge Null haben. Ein leerer String einer ALPHA-Variable ist MISSING. Die Quellvariable muss eine atomare Variable sein. Ob es sich um ALPHA-Variable handelt, ist unerheblich. Für alle Variablen wird der Text des Labels verwendet, der dem aktuellen Wert der Quellvariable entspricht. Gibt es zum gegenwärtigen Wert einer existierenden Variablen kein Label (kann bei ALPHA-Variablen nicht der Fall sein), wird ein leerer String (also MISSING) zurückgegeben. Man kann außerdem bestimmen, dass das Ergebnis in Groß- (UPPERCASE) oder Kleinbuchstaben (LOWERCASE) gewandelt werden soll. Wird keine der beiden Optionen verlangt, wird der Text unverändert verwendet wie in den Ausgangsvariablen. Wenn die Variable "<zielvariable>" existiert, muss sie vom Typ ALPHA sein. Existiert sie nicht, wird eine neue ALPHA-Variable generiert. Zum Beispiel: COMPUTE SUBSTR part = neuevar 1 20; COMPUTE SUBSTR kann auch als COMPUTE-Spezifikation in IF-Statements und deren ELSE-Komponente verwendet werden. Ein Beispiel: IF [ 2 3 ] IN x7 THEN SUBSTR part = neue 1 20 ELSE SUBSTR part = neue 1 10; |
COMPUTE SWAP agiert als ein COMPUTE COPY, das in beide Richtungen gleichzeitig funktioniert. Syntax: COMPUTE SWAP <varlist> = <varlist>; Zum Beispiel: COMPUTE SWAP b1 b2 = a1 a2; Als Resultat sind die Werte in b1 und a1 und die Werte in b2 und a2 miteinander vertauscht. Beide Variablenlisten müssen dieselbe Anzahl an Elementen haben. Anstelle einer Variablenliste kann auch eine MultiQ gesetzt werden - diese muss dann ebenfalls die passende Zahl an Elementen enthalten. Es können auch ALPHA-Variablen verarbeitet werden: Die Quell- und Zielvariablen werden von GESStabs auf die ALPHA-Eigenschaft geprüft. Sind beide beteiligten Variablen vom Typ ALPHA, werden intern zwei COMPUTE ALPHA-Befehle substituiert. Es müssen entweder alle oder keine der betroffenen Variablen die Eigenschaft ALPHA haben. Abweichungen hiervon führen zu einem Syntaxfehler. |