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 :) |
Administrator
|
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. |
No juu olisi pitänyt laittaa tuo tohon toimivasta esimerkistä... ilman tota datankäsittelyssä ei olisi kovinkaan pitkälle päässyt... ;) |
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 |
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 ################### .................. |
Administrator
|
This post was updated on .
In reply to this post by Petri Palmu
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 .................. 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. |
Free forum by Nabble | Edit this page |