Suomalaisten henkilötunnisten käsittely toimii hyvänä esimerkkinä siitä, miten R-ohjelmalla käsitellään merkkijonoja. Tässä olisi sukupuolen ja iän laskenta:
Sukupuoli:
gender<-function(id){ parts<-strsplit(id,split="-")[[1]] secondpart<-parts[2] number<-substr(secondpart,1,3) int<-as(number,"integer") if(int%%2==0){ return("F") }else{ return("M") } }
ikä päivinä:
#calculate age by days age<-function(id){ parts<-strsplit(id,split="-")[[1]] firstpart<-parts[1] numerona<-as(firstpart,"integer") today<-Sys.Date() shortyear<-as(substr(firstpart,5,6),"integer") if(substr(id,7,7)=="-"){ longyear<-1900+shortyear }else{ longyear<-2000+shortyear } bage<-as.Date(paste0(substr(firstpart,1,2),".",substr(firstpart,3,4),".",longyear),format="%d.%m.%Y") agedays<-difftime(today,bage,units = "days") return(as(agedays,"double")) }
Löytyvät myös GitHubista
Mielestäni koodia selventäisi huomattavasti, jos siinä olisi (yleisesti käytettyyn tapaan) välilyönnit aina operaattoreiden molemmin puolin ja pilkkujen jälkeen.
# EI if(substr(id,7,7)=="-"){ longyear<-1900+shortyear }else{ #jne. } # KYLLÄ if (substr(id, 7, 7) == "-") { longyear <- 1900 + shortyear } else { # jne. }
omaan silmään }else{ -tapa näyttää tökeröltä ja luettavuus heikkenee.
Jos on käsittelyssä elävät henkilöt esim. järjestelmään joka on K18, niin pelkällä viivalla pärjää vielä reilun vuoden :D
Grez kirjoitti:
Jos on käsittelyssä elävät henkilöt esim. järjestelmään joka on K18, niin pelkällä viivalla pärjää vielä reilun vuoden :D
Tukeehan tuo nuorempiakin, tuossa vain viiva on erikoistapaus. Kunhan ei käsittele yli 116 vuotta sitten syntyneitä eikä välitä validiudesta niin "toimii" :P
feenix kirjoitti:
Tukeehan tuo nuorempiakin, tuossa vain viiva on erikoistapaus.
Ensimmäinen funktio (sukupuolen tarkastus) ei tue nuorempia, koska siinä haetaan henkilötunnuksen loppuosa viivan perusteella.
Kyllä tätä pitäisi korjata.
Aihe on jo aika vanha, joten et voi enää vastata siihen.