Muuttujamuunnokset VAR jne.

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Muuttujamuunnokset VAR jne.

Petri Palmu
Avaan tähän keskustelua vähän yleisemmin muuttujamuunnoksista, kuten VAR.

Yksi pieni kysymys on, miksi merkkijonomuuttujaa ei voi alustaa suoraan toisella merkkijonomuuttujalla? Homma toimii numeerisen kohdalla ks. muuttuja T2. Oikeastaan tämä kiinnostaa enemmän koodin tasolla, et miksi numeerinen poikkeaa stringistä?



DATA _TEST9
ID  SOP   T
A   I01   1.5
A   I01   2
A   I99   3
A   P13   4
B   T99   3
B   T99   4
B   P20   2
C   F21   3
C   F21   4

...................

FILE COPY _TEST9 TO NEW TEST9
VAR SOP2:S3=SOP TO TEST9
VAR T2:S3=round(T) TO TEST9

FILE SHOW TEST9


#FILE LOAD +TEST9,CUR+1
 I SOP   T SOP T2
 A I01 1.5   0   1
 A I01 2.0   0   2
 A I99 3.0   0   3
 A P13 4.0   0   4
 B T99 3.0   0   3
 B T99 4.0   0   4
 B P20 2.0   0   2
 C F21 3.0   0   3
 C F21 4.0   0   4

################

#FILE STATUS TEST9
 Copy of data matrix _TEST9
FIELDS: (active)
   1 SA_   1 ID
   2 SA_   3 SOP
   3 NA_   4 T        (#.#)
   4 SA-   3 SOP2     ~SOP
   5 SA-   3 T2       ~round(T)
END
Survo data file TEST9: record=30 bytes, M1=7 L=64  M=5 N=9

#######################



Asia ei ole siis suurensuuri, mutta joskus tuon takia on välissä tehtävä apumuuttujia, jotka isossa datassa lisäävät homman kestoa ja datan kokoa :)
Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset VAR jne.

Reijo Sund
Administrator
Petri Palmu wrote
Yksi pieni kysymys on, miksi merkkijonomuuttujaa ei voi alustaa suoraan toisella merkkijonomuuttujalla?
Alustaminen onnistuu VARilla esim. seuraavalla tavalla:
..................................................
VAR SOP2:S3=MISSING TO TEST9
..................................................
VAR str(SOP2)=str(SOP) TO TEST9
..................................................

Seuraava toimii myös, vaikkei ehkä tulekaan kaikille ensimmäisenä mieleen :
..................................................
CLASSIFY TEST9,STR,SOP,SOP3
CLASSIFICATION STR
OTHER: SAME
END
..................................................

Mutta on totta, että ajoittain voisi toivoa VARin perusmuodon kopioivan myös merkkijonomuuttujan sisällön "automaattisesti". Katson olisiko asialle tehtävissä jotain.
Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset VAR jne.

Petri Palmu
Reijo Sund wrote

Alustaminen onnistuu VARilla esim. seuraavalla tavalla:
..................................................
VAR SOP2:S3=MISSING TO TEST9
..................................................
VAR str(SOP2)=str(SOP) TO TEST9
..................................................
No juu olisi pitänyt laittaa tuo tohon toimivasta esimerkistä... ilman tota datankäsittelyssä ei olisi kovinkaan pitkälle päässyt... ;)

Reply | Threaded
Open this post in threaded view
|

Muuttujamuunnokset VAR jne. -merkkijonojen käsittely

Petri Palmu

Kyselisin vähän, mihin VAR taipuu merkkijonojen erityisemmässä käsittelyssä. Ongelmani on siivota rekisteriin merkittyä toimialaluokitusta (SOP) sillä tavoin, että "tyhjä" luokka T99 muutetaan sitä edeltäväksi määritellyksi toimialaluokaksi. Esim. KOE1 datassa ajanhetkellä T = 2 oleva T99 -> T01, T =3: T99 -> T01. No lopputulos on nähtävissä SOP2 muuttujassa.

DATA _KOE1
ID  SOP   T
B   T01   1
B   T99   2
B   T99   3
B   P20   4
B   T99   5
B   T99   6
B   T01   7



FILE COPY _KOE1 TO NEW KOE1
.......................

/F2ESC
VAR SOP2:S3=MISSING TO KOE1
VAR str(SOP2):S3=str(SOP) TO KOE1
VAR APU:1=0 TO KOE1

...................
FILE SHOW KOE1
Kikkailu I:

/F2ESC
VAR APU=1 TO KOE1 /  SELECT=C1*C2 C1=ORDER,2,99 C2=SOP:T99
VAR str(SOP2)=str(SOP2[-1]) TO KOE1 /    SELECT=C3 C3=APU,1

..................
Lopputulos (SOP2 on jälkimmäinen SOP sarakkeista)
#FILE LOAD +KOE1,CUR+1
 I SOP T SOP APU
 B T01 1 T01   0
 B T99 2 T01   1
 B T99 3 T01   1
 B P20 4 P20   0
 B T99 5 P20   1
 B T99 6 P20   1
 B T01 7 T01   0
###################

Eli nyt T99 ovat poistuneet ja korvattu ajassa edeltäneillä varsinaisilla toimialaluokilla.
..............................................

Törmäsin kuitenkin ongelmaan, että Kikkailu I:n korvaaminen alla olevalla:


VAR str(SOP2)=if(str(SOP2)<>str(SOP2[-1]))then(A1)else(A2) TO KOE1
               A1=str(SOP2[-1])  A2=str(SOP2)

   SELECT=C1*C2  C1=ORDER,2,99 C2=SOP2:T99


ei toimi (ilmoittaa syntaksissa olevasta virheestä), vaikka mielestäni tuo on kirjoitettu sääntöjen mukaan). Voisiko olla niin, että merkkijonoille VAR-toiminnot ovat vähän suppeammat? Tässäkin tilanteessa olisin mieluusti välttänyt APU-muuttujan luonnin :)

t. Petri


Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset VAR jne. -merkkijonojen käsittely

Petri Palmu
Ohessa vielä samainen ongelma kuin
http://forum.survo.fi/Muuttujamuunnokset-VAR-jne-tp518p521.html

mutta lisättynä paneeliaineistolla, jossa on useita ID:eitä. APU=1 osoittaa, mitkä SOP-arvot muunnetaan. Tässä kyse on ns. vasemmalta sensuroiduista havainnoista, koska "datankeruu" alkaa yleisesti myöhemmin kuin ID:lle määrittyy ihan eka SOP-arvo. Itse data ihan toy-data... :)

DATA _KOE1
ID  SOP   T
B   T01   1
B   T99   2
B   T99   3
B   P20   4
B   T99   5
B   T99   6
B   T01   7
A   T99   2
A   T99   3
A   T99   4
A   F21   5
C   P30   1


FILE COPY _KOE1 TO NEW KOE1
.......................

/F2ESC
VAR SOP2:S3=SOP TO KOE1
VAR str(SOP2):S3=str(SOP) TO KOE1
VAR APU:1=0 TO KOE1 / alustetaan nollaksi

...................
FILE SHOW KOE1


/F2ESC
VAR APU=1 TO KOE1 /  SELECT=C1*C2 C1=ORDER,2,99 C2=SOP:T99  C3=APU,1
VAR APU=if(str(ID)<>str(ID[-1]))then(0)else(APU) TO KOE1 / SELECT=C1*C3
VAR str(SOP2)=str(SOP2[-1]) TO KOE1 /    SELECT=C3*C2


..................
#FILE LOAD +KOE1,CUR+1
 I SOP T SOP APU
 B T01 1 T01   0
 B T99 2 T01   1
 B T99 3 T01   1
 B P20 4 P20   0
 B T99 5 P20   1
 B T99 6 P20   1
 B T01 7 T01   0
 A T99 2 T99   0
 A T99 3 T99   1
 A T99 4 T99   1
 A F21 5 F21   0
 C P30 1 P30   0
###################
..................
Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset VAR jne. -merkkijonojen käsittely

Reijo Sund
Administrator
This post was updated on .
In reply to this post by Petri Palmu
Petri Palmu wrote
Kyselisin vähän, mihin VAR taipuu merkkijonojen erityisemmässä käsittelyssä.
Hmmm.. Tässä tilanteessa pystynet käyttämään suoraan seuraavaa yksinkertaistettua menettelyä:
..................
VAR SOP2:S3=MISSING TO KOE1
VAR str(SOP2):S3=str(SOP) TO KOE1
..................
VAR str(SOP2)=str(SOP2[-1]) TO KOE1 /  SELECT=C1*C2 C1=ORDER,2,99 C2=SOP:T99
..................


Petri Palmu wrote
Törmäsin kuitenkin ongelmaan, että Kikkailu I:n korvaaminen alla olevalla ... ei toimi (ilmoittaa syntaksissa olevasta virheestä). Voisiko olla niin, että merkkijonoille VAR-toiminnot ovat vähän suppeammat?
Tässä tilanteessa tuo ehdotuksesi siis näytti turhan monimutkaiselta (en oikein saanut edes logiikasta kiinni), mutta jatkoviestissä esittämäsi merkkijonomuotoisen ID-muuttujan tilanne on kyllä todellinen (joskin ehkä voisi olla tarkoituksenmukaista käyttää alusta alkaen numeerista ID:tä) ja heijastelee sitä, että merkkijonomuuttujien käsittelyssä on tosiaan hiukan vähämmän mahdollisuuksia.