String Variable codieren

Fragen und Diskussionen rund um die Arbeit mit SPSS. Für allgemeine Statistik-Themen, die nicht mit SPSS zusammenhängen, bitte das Statistik-Forum nutzen.
emma78
Beiträge: 9
Registriert: 24.01.2009, 15:36

String Variable codieren

Beitrag von emma78 »

Hallo,
ich habe fünf string Variablen. In diesen möchte ich gerne nach bestimmten Schlüsselwörtern suchen.


Ich habe z.B.
ID v1 v2 v3 v4 v5
1 text house
2 ext
3 tower

Nun möchte ich nach diesen keywords suchen

ext ex=> dies soll als 'text' definiert sein
hous ous => dies soll als house' definiert sein
tow wer=> und dieses als 'tower'.
Für jedes dieser vorab definierten keywords sollen neue Variablen angelegt werden, die mit 0-1 codiert sind, 1 steht für genannt.
Am Ende soll es dann so aussehen:

ID text house tower
1 1 1 0
2 1 0 0
3 0 0 1

Dieses Macro habe ich gefunden und auf meine Variablen angepasst:

define FINDEN (!pos !charend ('/') / !pos !tokens (1)
/ var=!tokens (1)).
!do !i !in (!1).

if (index(upcase (!v1), (!quote(!upcase(!i)))) ne 0)
text= (!quote (!2)).
if (index(upcase (!v2), (!quote(!upcase(!i)))) ne 0)
text= (!quote (!2)).
if (index(upcase (!v3), (!quote(!upcase(!i)))) ne 0)
text= (!quote (!2)).
if (index(upcase (!v4), (!quote(!upcase(!i)))) ne 0)
text= (!quote (!2)).
if (index(upcase (!v5), (!quote(!upcase(!i)))) ne 0)
text= (!quote (!2)).
!doend
exe.
!enddefine.
FINDEN ext ex / 1.
exe.

Das klappt auch ganz gut, allerdings wird hier ja nur eine neue Variable 'text' angelegt.

Wie kann ich dieses Makro ändern, so dass es durch alle fünf Variablen schaut und nach meinen Begriffen sucht und für alle vorab definierten Oberbegriffe neue Variablen anlegt ?

Also wenn jemand 'ex' in einem der fünf Textfelder sagt, soll eine 1 in die Variable text eingetragen werden.

Vielen Dank im Voraus für jeden Hinweis :D
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

meiner Meinung nach viel zu kompliziert. Hier eine Alternative:

Code: Alles auswählen


DATA LIST FREE / 	ID (f8.0) v1 (a20) v2 (a20) v3 (a20) v4 (a20) v5 (a20).
BEGIN DATA
1 haus ext hose hemd schlips
2 ext house hose tower pferd
3 tower house ext schaukel schlips
END DATA.

do repeat #i =v1 to v5.
if CHAR.RINDEX(#i,'ext') >0 ext = 1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if CHAR.RINDEX(#i,'ous') >0 ous = 1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if CHAR.RINDEX(#i,'wer') >0 wer = 1.
end repeat.
EXECUTE .

Gruß
drfg2008
emma78
Beiträge: 9
Registriert: 24.01.2009, 15:36

Beitrag von emma78 »

Super danke, eine einfachere Lösung kommt mir natürlich gelegen :D
Ich habe sie einmal ausprobiert und da kommt als Meldung
Error # 4023 in column 5. Text: CHAR.RINDEX
>Ein Ausdruck enthält eine Zeichenfolge gefolgt von einer linken Klammer.
>Dadurch wird angegeben, daß die Zeichenfolge einen Funktions- bzw.
>Vektornamen darstellt. Es ist jedoch kein Vektor und keine Funktion dieses
>Namens vorhanden. Überprüfen Sie die Schreibweise.
>This command not executed.

Woran könnte das liegen?
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

Bei der Übertragung von Syntax über HTML kann es zu Problemen kommen.

Das Programm lässt sich hier herunter laden:

http://www.frag-einen-statistiker.de/sp ... slesen.sps

Das muss dann allerdings funktionieren. Nicht vergessen, erst den Datensatz zu erzeugen über DATA LIST FREE

Gruß
drfg2008
emma78
Beiträge: 9
Registriert: 24.01.2009, 15:36

Beitrag von emma78 »

Hm, komisch kann es an der Version liegen? im moment arbeite ich mit 15. auch wenn ich es über den anderen Weg herunterlade kommt dieselbe Fehlrmeldung...
aber danke schon mal :)
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

Meine Version ist die 17. Prüfe einmal, ob der Befehl CHAR.RINDEX bei der 15 schon existiert. Bei der 11 existiert er nämlich noch nicht, wie ich gerade sehe. Ansonsten gibt es auch andere Möglichkeiten das programmiertechnisch umzusetzen. Zum Beispiel deine Variante, nur eben ohne Makro, sondern in einer Schleife.

Gruß
drfg2008
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

Alternative:

Code: Alles auswählen

*Variante 2

DATA LIST FREE / 	ID (f8.0) v1 (a20) v2 (a20) v3 (a20) v4 (a20) v5 (a20).
BEGIN DATA
1 haus ext hose hemd schlips
2 ext house hose tower pferd
3 tower house ext schaukel schlips
END DATA.

do repeat #i =v1 to v5.
if CHAR.INDEX(#i,'ext') >0 ext=1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if CHAR.INDEX(#i,'ous') >0 ous=1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if CHAR.INDEX(#i,'wer') >0 wer=1.
end repeat.
EXECUTE .
drfg2008
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

und das müsste wirklich gehen (denn index findet sich auch im Makro)

Code: Alles auswählen

*Variante 3

DATA LIST FREE / 	ID (f8.0) v1 (a20) v2 (a20) v3 (a20) v4 (a20) v5 (a20).
BEGIN DATA
1 haus ext hose hemd schlips
2 ext house hose tower pferd
3 tower house ext schaukel schlips
END DATA.

do repeat #i =v1 to v5.
if INDEX(#i,'ext') >0 ext=1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if INDEX(#i,'ous') >0 ous=1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if INDEX(#i,'wer') >0 wer=1.
end repeat.
EXECUTE .

do repeat #i =v1 to v5.
if INDEX(#i,'ips') >0 ips=1.
end repeat.
EXECUTE .

Gruß
drfg2008
emma78
Beiträge: 9
Registriert: 24.01.2009, 15:36

Beitrag von emma78 »

Stimmt mit index klappt es :) am Montag habe ich auch zugriff auf die 18 er Version da probiere ich mal die anderen Varianten aus.
eine Frage hätte ich noch: wie kann ich verschiedene Schreibweisen aufnehmen? also das ex sowie xe in die text Variable kodiert werden sollen?
Ich habe nämlich einige Variablen die so kodiert werden sollen und wenn ich dann für jede Variante diesen Block anpassen müsste, könnte es etwas lang werden...
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

mehr Argumente in die Schleife aufnehmen.

Code: Alles auswählen

do repeat #i =v1 to v5.
if INDEX(#i,'ips') >0 ips=1.
if INDEX(#i,'sip') >0 ips=1.
if INDEX(#i,'psi') >0 ips=1.
end repeat.
EXECUTE .
mit Python geht das kompakter. Hier könnte man ein Array aus Suchbegriffen zusammenstellen.

Gruß
drfg2008
emma78
Beiträge: 9
Registriert: 24.01.2009, 15:36

Beitrag von emma78 »

Hi,
und eine andere Möglichkeit als Python gibt es nicht das ganze etwas kompakter zu gestalten? Ich habe zum Schluss an die 50 Variablen und viele verschiedene Schreibweisen so dass ich dann ja über 100 Zeilen hätte...
Ich bin dankbar für jeden Tip :)
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

100 Zeilen sind besser als 100 Makros ;-)

Natürlich könntest du in deinem Makro für "text" auch einen Token einsetzen, der aber im Makrokopf erst noch definiert werden müsste.

Ansonsten geht auch folgende -völlig unelegante aber effektive- Lösung:

Code: Alles auswählen

DATA LIST FREE /    ID (f8.0) v1 (a20) v2 (a20) v3 (a20) v4 (a20) v5 (a20).
BEGIN DATA
1 haus ext hose hemd schlips
2 ext house hose tower pferd
3 tower house ext schaukel schlips
END DATA. 


DEFINE macro (arg1 = !TOKENS(1)
                        /arg2 = !TOKENS(1))
do repeat #i =v1 to v5.
if INDEX(#i,!arg1) >0 !arg2=1.
end repeat.
EXECUTE .
!ENDDEFINE.

macro arg1 = 'ouse'  arg2= house.
macro arg1 = 'ous'  arg2= house.
macro arg1 = 'use'  arg2= house.

macro arg1 = 'ext'  arg2= text.
macro arg1 = 'xt'  arg2= text.
macro arg1 = 'tex'  arg2= text.

*
*
Gruß
drfg2008
emma78
Beiträge: 9
Registriert: 24.01.2009, 15:36

Beitrag von emma78 »

Eine klitzekleine FRage hätte ich noch dann gebe ich Ruhe :D
Hast mir schon sehr weiter geholfen.

Gibt es eine Möglichkeit in deinem Makro
die verschiedenen Schreibweisen nebeneinander in einer Zeile (also ...'ous' 'use'...) anzuordnen? wie müsste ich diese trennen?
macro arg1 = 'ous' arg2= house.
macro arg1 = 'use' arg2= house.
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

das Abarbeiten von Listen ist damit nicht möglich -> Python wäre möglich.

Gruß
drfg2008
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

hier ein vollständiges Python Beispiel

- beliebig viele Textfragmente die gesucht werden können
- beliebig viele Variablen die durchsucht werden
- eine Zielvariable

Code: Alles auswählen

* Python Beispiel.

DATA LIST FREE /    ID (f8.0) v1 (a20) v2 (a20) v3 (a20) v4 (a20) v5 (a20).
BEGIN DATA
1 haus ext hose hemd schlips
2 ext house hose tower pferd
3 tower house ext schaukel schlips
END DATA. 

BEGIN PROGRAM.
import spss
i = 0
array=['ouse', 'ous', 'use','aus']

for i in range(len(array)):
    variable=array[i]
    print variable
    spss.Submit(r"""
    do repeat #i =v1 to v5.
    if INDEX(#i,'"""+variable+"""') >0 v_house=1.
    end repeat.
    EXECUTE .
    """)

END PROGRAM.
Gruß
drfg2008
Anzeige:Statistik und SPSS: Die besten Bücher
Als Buch oder E-Book - Jetzt bestellen
spss datenanalyse
SPSS - Moderne Datenanalyse - Jetzt bestellen!
statistik datenanalyse
Statistik - Der Weg zur Datenanalyse - Jetzt bestellen!
Antworten