VAR R-funktioilla

[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!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.