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... :)