[viesti Survo-keskustelupalstalla (2001-2013)]
Kirjoittaja: | Petri Palmu |
---|---|
Sähköposti: | - |
Päiväys: | 2.3.2006 15:49 |
Heippa, Olen yrittänyt vähän taiteilla R:n ja Survon kanssa, josko R:n muuttujamuunnoksia voisi käyttää ikään kuin Survon VAR-operaationa. Tässäpä hieman demoa: DATA _KOE1 HOBBY Y auto 1 koira;kissa 1 juoksu 1 kissa 1 kirjat 1 survo;auto 1 sienet 1 R;survo 1 srvo 1 metsästys 1 monta_asiaa:_R,musa,kissat 1 monta_asiaa:_survo;musa;kissat 1 FILE COPY _KOE1 TO NEW KOE FILE SHOW KOE 1. Säännölliset lausekkeet (ks. funktiot viestin lopussa) survo (sallitaan kirjoitusvirheitä) /R_VAR SURVO=f.agrep("survo",KOE$HOBBY) TO KOE survo tai auto (virheitä ei sallita) /R_VAR SURVOCAR=f.grep("auto|survo",KOE$HOBBY) TO KOE 2. Muita Osite indeksi: /R_VAR PARTS=gl(3,4) TO KOE / KOE$Y (huom.) Ja tältä näyttävät tulokset FILE LOAD KOE DATA KOE*,A,B,C HOBBY Y SURVO SURVOCAR PARTS auto 1 0.000 1.000 1.000 koira;kissa 1 0.000 0.000 1.000 juoksu 1 0.000 0.000 1.000 kissa 1 0.000 0.000 1.000 kirjat 1 0.000 0.000 2.000 survo;auto 1 1.000 1.000 2.000 sienet 1 0.000 0.000 2.000 R;survo 1 1.000 1.000 2.000 srvo 1 1.000 0.000 3.000 metsästys 1 0.000 0.000 3.000 monta_asiaa:_R musa 0.000 0.000 3.000 monta_asiaa:_survo;musa;kissat 1 1.000 1.000 3.000 Tämä toimii vain silloin kun uusi muuttuja on numeerinen, esim. päivämäärä -merkkijono ei onnistu: /R_VAR DATE=dates("1.1.06") TO KOE / KOE$HOBBY LIB=library(chron) (LIB tarkoittaa, että muunnosta varten tarvitaan chron paketti) Sukrossa uusi muuttuja on siirretty aineistoon VAR + INDATA:aa hyödyntäen. Tähän pitäisi keksiä jokin parempi tapa ellei merkkijonoa voida sallia. Hankaluutta aiheuttaa joka tapauksessa se, että merkkijonon pituus pitäisi kai tietää etukäteen. Jos tämän voisi välttää, niin esim. MATCH=# olisi luonteva. Tässä versiossa on mahdollista kirjoittaa R-funktio ainoastaan yhdelle riville, yleistäminen useammalle riville vaatii pikkaisen erilaisen toteutuksen kuin {save line Wline}, homma ilm. tekstitiedostona. Kaikenlaista muutakin pitänee huomioida, t. Petri Lopussa kaksi tekemääni R-funktiota f.agrep ja f.grep, jotka pitää tallettaa SURVO.R tiedostoon Tässä sukron listaus: *TUTSAVE R_VAR / / /R_VAR <NEWVAR>=<R-function of <data>$<OLDVAR>'s> TO <data> / / / VAR transformation by R functions / *{tempo -1}{init} - if W1 '=' RETURN then goto E2 / / def Wvar=W10 Wrfunc=W3 Wfile=W5 Wargs=W7 Wtmp=W9 / def Wdatapath=W11 Wtempdisk=W12 Wline=W13 / def Wx1=W21 Wx2=W22 Wx3=W23 Wx4=W24 Wdata2=W24 / def Wdatapath2=W31 Wsystempath=W32 Wversion=W33 / *{init}{tempo 0}{line start}{save line Wline} *{save stack}{W1=VAR}{call SUR-SAVE}{del stack}{load stack} / / if Wfile '=' {} then goto ERR1 / *{jump 1,1,1,1}SCRATCH {act}{line start} / *{form}/R_VAR RETURN / to current application / *{R} *REDIM 2000,200{act}{R} *RESIZE 54,90{act}{R} *{ref set 1}{R} *{print Wline} *{ref jump 1}{line start} *REPLACE "="," ",C{act}{line start}{erase} *REPLACE "$"," $ ",C{act}{line start}{erase} *REPLACE "(","( ",C{act}{line start}{erase} *REPLACE ")"," )",C{act}{line start}{erase} *REPLACE ","," , ",C{act}{line start}{erase} *REPLACE " "," ",C / LINES=CUR+1,END{act}{line start}{erase} *REPLACE " "," ",C / LINES=CUR+1,END{act}{line start}{erase} / *{R}{next word}{save word Wvar}{line start}{u2}{ins line}{ref set 1} *FIND ") TO "{act}{R}{next word}{next word}{save word Wfile}{ref jump 1} *{line start} *{ins line}{print Wfile}{sp}{print Wvar} / data{R} /{goto END} / *{ins line}{line start}{ref set 2}{u}{line start}{ref set 1} / VARS lista + GetVars: {ref jump 1}{line start}{erase} *FIND "{print Wfile} "{act}{R}{del}{next word}{save word Wtmp} - if Wtmp '=' {sp} then goto EndGvar - if Wtmp '<>' $ then goto GetVars *{next word}{save word Wx1} / if Wx1 '=' {} then goto EndGvar *{ref jump 2}{line end}{print Wx1}, *{goto GetVars} + EndGvar: {R}{line end}{l}{del}{line start}{save line Wx1}{R} / /{jump end+1,end+2,1}{print Wx1} /{goto END} *{save datapath Wdatapath}{save tempdisk Wtempdisk} *{print Wdatapath}{R} *{R} *..................{R} *CHECK {print Wfile}.SVO{act}{r}{save char W2} - if W2 '<>' O then goto ERR2 *{R} /{goto END} *.............{R} *VARS={print Wx1} / {print Wline}{R} /{goto END} *>DEL {print Wtempdisk}_tmp1.txt{act}{R} *FILE LOAD {print Wfile} TO {print Wtempdisk}_tmp1.txt /{sp} *DELIMITER=TAB NAMES=8{act}{R} *...............{R} /{goto END} *CD {print Wtempdisk}{act}{R} *{ins line} *{print Wline} *{u}{line start}{erase} *FIND "="{act}{R}{del}{save line Wline}{line start}{erase} *{print Wline} *{u}{line start}{erase} *FIND " TO "{act}{R}{erase}{line start}{save line Wline}{R} *...............{R} /{goto END} *{ref set 1}{R} *{print Wfile} <- read.table("_tmp1.txt", header=T, sep="\t"){R} *#{R} *{print Wfile}${print Wvar} <- {print Wline}{R} *tmp1 <- {print Wfile}[, "{print Wvar}"]{R} *# names(tmp1) <- "{print Wvar}"{R} *write.table(tmp1, file="_{print Wvar}.txt", col.names=FALSE ,{R} *quote=F, sep="\t", row.names=FALSE){R} *#{R} *{ref jump 1} *SAVEP CUR+1,END,_r.r{act}{jump end+1,end+1,1}{R} / *{save datapath Wdatapath2}{save systempath Wsystempath} / *PUTENV R_PROFILE={write Wsystempath}SYS\SURVO.R{act}{R} / *{print Wdatapath2}{R} *{line start}{erase}{pre}F{ref} /{goto END} / *{save system R_path W6}>{print W6}\bin\RTERM.EXE * HOME={write Wdatapath2} * &{R} * --save -q / --no-restore --no-save -q /{goto END} + A: <_r.r >R.LIS 2>&1{ref}{ref}{act} /{del line}{del line} /{del line} *{R} *{R} *.............{R} *DELIMITER=TAB FIRST=1 LAST=99999999999 / (max survon sallima){R} *FILE SAVE _{print Wvar}.txt TO NEW {print Wdatapath}__TMP{act}{R} *>DEL *.RData{act}{R} /{goto END} *CD {print Wdatapath}{act}{R} *..............{R} *FILE EXPAND {print Wfile},1,20{act}{R} /Tässä ongelma: jos vektori on merkkijono, niin homma ei onnistu *INDATA=__TMP{R} *VAR {print Wvar}=D1:X1 TO {print Wfile}{act}{R} / /{goto END} *{W1=VAR}{call SUR-RESTORE}{goto END} / + ERR1: {message} Usage: /R_VAR Y=f(DATA$X) TO DATA!@ *{goto E1} + ERR2: {message} Data file not found!@{goto E1} / + E1: - on key - key _: continue - wait 300 + E2: {message}@{W1=VAR}{call SUR-RESTORE} + END: {R}{end} *..................... * SURVO.R -tiedostoon ## Grep (indicator variable) ## f.grep<-function(string,x, ignore.case = TRUE, extended = TRUE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE) { lv.0<-as.character(x) lv.1<- rep(0,length(lv.0)) lv.1[grep(string,lv.0, ignore.case = ignore.case, extended = extended, perl = perl, value = value, fixed = fixed, useBytes = useBytes)]<-1 lv.1 } ## ## Agrep ## f.agrep<-function(string,x, ignore.case = TRUE, value = FALSE, max.distance = 0.1) { lv.0<-as.character(x) lv.1<- rep(0,length(lv.0)) lv.1[agrep(string,lv.0, ignore.case = ignore.case, value = value, max.distance = max.distance)]<- lv.1 } ## .......................
Vastaukset: |
---|
Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!