Survo R:ssä on hyviä toimintoja, että saa datat liikkumaan jouhevasti R:n data.framen ja .SVO-tiedostojen välillä.
DATA _K X Y 1 a FILE LOAD _K TO R>D / STRIP_WHITE=1 Tässä toimivat IND,VARS,... FILE DEL K2 R CUR+1,CUR+2 D; # tulostaa data write.svo(D, "K2.SVO"); #FILE LOAD +K2,CUR+1 X Y 1 a ################## FILE COPY _K TO NEW K R CUR+1,CUR+1 D <- read.svo("K.SVO");D; # tulostaa datan Mitä optioita esim. write.svo():hon liittyy? Voiko siellä valita, että ko. tilanteessa (mahd. jo olemassa oleva) K2.SVO tuhotaan (ennen uuden luomista)? Näin ei tarvitsisi ennen R-koodia tehdä tuota FILE DELiä (muussa tapauksessa joutuu manuaalisesti vastaamaan Y/N). Mutta yleisemminkin kiinnostaa, mitä kaikkea read.svo ja write.svo pitävät sisällään :) |
Administrator
|
Eli data liikkuu R:n suuntaan Survosta komennolla: FILE LOAD KOE TO R>koe R:stä Survo-tiedostoksi puolestaan voi käyttää komentoa: FILE SAVE R>koe TO NEW KOE Käytettäessä noita toimituskentässä, osa-aineistoihin rajoittavat täsmennykset toimivat. Tietyissä tilanteissa myös STRIP_WHITE=1 täsmennystä on hyödyllistä käyttää FILE LOADin kanssa, niin pääsee automaattisesti eroon ylimääräisistä välilyönneistä yms. FILE SAVEn kanssa voi käyttää tuota komennon TO NEW -muotoa, jolloin vanhan datan päälle kirjoitetaan automaattisesti. Noiden lisäksi on olemassa R-funktiot read.svo() ja write.svo(), jotka tekevät täsmälleen samat jutut kuin em. komennot, mutta ilman mahdollisuuksia täsmennyksiin yms. Nämä funktiot tarjoavat keinon lukea Survon datoja R:ään foreign-paketin tyylisellä tavalla ja voivat olla joskus myös hyödyllisiä joissain R:n scripteissä, mutta toimittaessa editorissa kannattaa kyllä käyttää suoraan noita FILE-komentoja täsmennyksineen. |
Mistäköhän lähtisin etsimään mokaani, kun kumpikaan noista keinoista ei johda mihinkään?
Tässä ilmoitukset: *R CUR+1,CUR+1 *READ.SVO(s5valfi) could not find function "READ.SVO" *FILE LOAD s5valfi TO R>fi Cannot open data file Ja olen varmistanut, että hakemistopolku on oikea ja sen päässä on juuri tuonniminen .svo -tiedosto. |
Administrator
|
Hei,
Et tarvitse muuta kuin Survo-komennon (aktivoi ESC-napilla) FILE LOAD s5valfi TO R>fi niin Survo-datasi s5valfi (tiedosto s5valfi.svo) siirtyy R-dataksi fi. - Kimmo |
Kiitos, mutta kun se silloinkin sanoi, että Cannot open data file. Laitoin vain kummatkin kokeilemani keinot varmuuden vuoksi esille. 2015-01-24 14:12 GMT+02:00 Kimmo Vehkalahti [via Survo Forum] <[hidden email]>: Hei, |
Okei, tiedoksi: kopioin tiedostot toisaalle ja sinne Survo löysikin, joten ongelma ratkesi sillä. Kiitos avusta!
|
In reply to this post by Sussa
Heippa, R:ssä kaikki on eroa pienillä ja suurilla kirjaimilla ("Survo:n" osalta FILE LOAD = file load). Lisäksi nimet annetaan joko ' ' tai " " sisällä. read.svo():ssa ilmeisesti pitää myös olla perässä tiedostopääte .SVO. Elikkäs: d <- read.svo("s5.valfi.SVO"); str(d); head(d); read.svo() on ihan kätevä funktio, jolla pääset mihin tahansa .SVO muotoiseen dataa käsiksi :) |
Kiitos Petri - pidän mielessä. Nyt yritin yhdistellä kolme tiedostoa (objektit fi, gb, ger alla) merge-komennolla ja se onnistui ilman kommervenkkejä, mutta kun fix-komennolla yritin katsoa lopputulosta, olivat kaikki solut tyhjiä. Eli sarakkeiden päällä olivat muuttujien nimet, mutta mitään lukarvoja ei ollut. Tiedostoissa siis kaikissa samat muuttujanimet, taustatietomuuttujien nimiä lukuunottamatta, jolloin ymmärsin, että merge yhdistelisi kaikki identtiset muuttujat allekkain. Mutta ei... Tämä siis käyttämäni komento: mydata1 = merge(fi, gb) kokodata = merge(mydata1, ger) 2015-01-24 17:51 GMT+02:00 Petri Palmu [via Survo Forum] <[hidden email]>:
|
In reply to this post by Sussa
FILE LOADin lisäksi myös FILE COPY toimii siirrossa .SVO -> R:n data.frame (ks. tämän viestiketjun eka viesti :) |
In reply to this post by Sussa
Tuo merge() tuntuu aina joskus vähän oudolta. ?merge() saat esiin ko. toiminnon parametrit. Kannattanee ilmoittaa parametrit, merge(x=data1, y=data2, by="yhdistelyavain", all.x=TRUE, sort=TRUE...) Tuo all.x tarkoittaa, että kaikki data1:n rivit otetaan mukaan lopputulokseen. Jos lisäät vielä all.y=TRUE, niin lopputulokseen tulee kaikki x ja y datan taustamuuttujien arvot. by parametrilla ilmoitetaan minkä taustamuuttujan (tai muuttujien) suhteen yhdistely tehdään. data1 ja data2 taustamuuttujakenttien nimet voivat olla eri, esim. "sp" ja "sukup" (molemmat tarkoittaa sukupuolta). Mutta tällöin by:n sijaan by.x="sp", by.y="sukup". Ongelma varmasti selviää jos laitat molemmista datoista kuvauksen. R:n str(data) ja head(data) saat tiedostojen rakennetta näkyviin. Luultavasti merge ei jostain syystä löydä yhtään samaa havaintoa täsmättävien taustatietojen välillä. |
In reply to this post by Reijo Sund
Välillä sitä luulee, että on ymmärtänyt jotain ja rupeaa polleaksi. Kunnes sitten ihan perusasioihin kompastuu.
Yritän alla avata AINEISTO.SVO:n nuo listatut muuttujat ja viedä tiedot objektiin evop. Sitten yritän tallentaa nämä tiedot EVOP.SVO-tiedostoksi ja lisätä sinne noita VAR-komentojen uusia muuttujia. Minnekään ei ilmesty EVOP.SVO-tiedostoa. Mitä teen väärin? VARS=SF01,SF02,SF03,SF04,SF05,SF06,SF07,SF08,SF09,SF10,SF11,& SF12,SF13,SF14,SF15,SF16,SF17,SF18,SF19,SF20,SF21,SF22,SF23,SF24,& SF25,SF26,SF27,SF28,SF29,SF30,SF31,SF32,SF33,SF34,SF35,SF36,SF37,& SF38,SF39,SF40,SF41,SF42,SF43,SF44,SF45,SF46,SF47,SF48,SF49,SF50,& SF51,SF52,SF53,SF54,SF55,SF56,SF57,SF58,SF59,SF60 FILE LOAD AINEISTO TO R>evop FILE SAVE R>evop TO EVOP VAR Dom1=SF11-SF46 TO EVOP VAR Dom2=SF22-SF37 TO EVOP VAR Dom3=SF39-SF24 TO EVOP VAR Dom4=SF34-SF29 TO EVOP VAR Dom5=SF44-SF19 TO EVOP VAR Anx1=SF01-SF56 TO EVOP VAR Anx2=SF31-SF26 TO EVOP VAR Anx3=SF51-SF06 TO EVOP VAR Anx4=SF07-SF52 TO EVOP VAR Anx5=SF59-SF04 TO EVOP |
Administrator
|
Jos datalle ei tehdä mitään oikeasti tähdellistä R:n puolella tuossa vaiheessa, niin sitä on turha kierrättää sitä kautta ja jos on vain tarvetta uudelle tiedostolle, niin riittää komento: FILE COPY AINEISTO TO NEW EVOPJos kuitenkin pitää siirtää jostain syystä R:stä tavaraa, niin tuohon voisi varmuuden vuoksi lisätä rajarivin ja täsmentää heti, että halutaan uuteen tiedostoon: ............... FILE SAVE R>evop TO NEW EVOP Kummassakin tapauksessa tiedosto EVOP.SVO syntyy nykyiseen työhakemistoon (hyvin todennäköisesti sama kuin missä AINEISTO.SVO on). Työhakemiston näet Survon ikkunan alapalkista kohdasta Path. Jos se viittaa erikoiseen hakemistoon jota et millään löydä, kuten esim. <Survo>, niin vaikkapa komennolla CD * tai sitten File-valikon Change Directory -kohdasta saat esiin hakemistonvaihtodialogin, jossa näkyy koko pitkä polkunimi. Tai R:n ikkunaan saat pitkän polun näkyviin aktivoimalla komennon R>getwd() Entä pääsetko esim. komennolla FILE SHOW EVOP katsomaan tiedoston sisältöä? Jos kyllä, niin tiedosto on kyllä olemassa. VAR-komennotkin antavat virheilmoituksen, jos tiedostoa ei ole olemassa. Niitä voisi muutenkin halutessa vähän tiivistää: VAR Dom1,Dom2,Dom3,Dom4,Dom5,Anx1,Anx2,Anx3,Anx4,Anx5 TO EVOP Dom1=SF11-SF46 Dom2=SF22-SF37 Dom3=SF39-SF24 Dom4=SF34-SF29 Dom5=SF44-SF19 Anx1=SF01-SF56 Anx2=SF31-SF26 Anx3=SF51-SF06 Anx4=SF07-SF52 Anx5=SF59-SF04 |
In reply to this post by Petri Palmu
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... :) |
Administrator
|
"tarkoitus on ohjata Survon FILE SAVE toimintoa"
Tuota voisi hyvin kutsua termillä "supervised learning". - Kimmo |
Jokunen vuosi tässä on koitettu päästä Survon päänupin sisuksiin . |
Free forum by Nabble | Edit this page |