Numeeristen muuttujien tyyppien käsittely R:n ja Survon datojen välillä

Posted by Petri Palmu on
URL: https://forum.survo.fi/Datan-siirtamista-SVO-ja-R-n-data-framen-valilla-read-svo-write-svo-tp523p692.html

Oli pientä tuskailua siinä, kun R:n datassa oli integer-tyyppisiä muuttujia, jotka saavat arvoja esim. 0,1,2 , jotka siten tallensin write.svo():lla .SVO-tiedostoksi. Survo tekee niistä Numeerisia TYPE = 1, joissa ei voi olla desimaaleja. Tarvitsen  type  = 4/8 muuttujia, kun teen muuttujamuunnoksia esim. X/2...

Pääsin tavoitteeseen, lähtötilanne

FILE STATUS data
..... 
 107 NA_   1 LATYO    LATYO (#####)
 108 NA_   1 SUTYO    SUTYO (#####)
 109 NA_   1 PAIVTYO  PAIVTYO (#######)

Lopputulos:

FILE STATUS data
....
107 NA_   8 LATYO    LATYO (###.#####)
108 NA_   8 SUTYO    SUTYO (###.#####)
109 NA_   8 PAIVTYO  PAIVTYO (###.#####)


Eli nyt voi tehdä esim. LATYO/2 tyyppisiä muunnoksia (tässä tapauksessa {0,1,2} -> {0,.5,1}).

Se miten ratkaisin asian oli:
## R-koodia, jolla luetaan lähtönä oleva Survo-tiedosto (jossa muuttujatyypit on väärät)
D <- read.svo(data.SVO);

# Pinotaan 1. havaintorivi datan päälle, jota käytetään "hämäämisessä" :)
D <- rbind(D[1,], D);

for(k in names(D)) {
 # jos muuttuja numeerinen niin tehdään desimaaliluku datan 1. riville
 # Muussa tapauksessa joku merkki (alla Z)
 if(class(D[,k]) %in% c("numeric", "integer")) { D[1,k] <- 999.99999} 
 else {D[1,k] <-  "Z"};
};
## Tallennetaan D tekstitiedostoksi (joka luetaan .SVO:ksi)
write.table(D, "d.txt",...); #
## Voisi myös suoraan Tallentaan write.svo():lla

Näin on saatu tekstitiedosto, jossa eka rivi on "hömppärivi"... mutta hömpän tarkoitus on ohjata Survon FILE SAVE toimintoa, niin että muuttujat ovat N TYPE = 4/8 (###.####), kuten tuossa yllä lopputuloksessa.
Oikeasti tässä huijataan R:ää, joka tuntuu tallettavan esim. 1.0000 tyyppiset luvut ilman desimaaleja (1) (esim. write.table(), joka taas ohjaa Survon tulkitsemaan, että data tyyppi on  N TYPE = 1....

Tässä vielä, miten loppusilaus hoituu, kun R:stä on talletettu tekstitiedoksi.

FILE DEL TMP1
....................
 MAXFIELDS=400 VARLEN=300
     FILTER=WIN2.BIN / Että ääkköset menee oikein...
FILE SAVE d.txt TO TMP1 / NAMES=1 FIRST=2 DELIMITER=TAB MISSING=NA
..................
Eka rivi veks...
FILE COPY TMP1 TO NEW data / SELECT=!C1 C1=ORDER,1
.......................
Prosessi jatkuu...

Kokeilin eri tapoja, mutta jotenkin tämä tuntui kaikkein yksinkertaisimmalta. Itse ongelman löysin kun vertasin kahden eri vuoden datoja, esim. tuossa lauantaityössä oli kaikki 0.5 arvoiset havainnot -> 0. Noiden vuosien aikana kyselyjärjestelmä on vaihtunut ja muutenkin raakadata tulee eri prosessien kautta... :)