3 . Kapitulua Funtzioak

Rko objektu garrantzitsuenetako batzuk funtzioak dira. Funtzioak datuen gaineko operazio konplexuagoak egiteko erabiliko ditugu. Behin baino gehiagotan erabili beharko ditugun agindu zerrendak enkapsulatzeko balio dute eta behin definituta eta izen bat esleituta, nahi adina aldiz erabili ditzakegu.

3.1 Funtzioen erabilera

Hasteko, garrantzitsua da jakitea Rn iada funtzio asko inplementaturik daudela. Beraz, askotan, behar dugun funtzioa bilatu eta erabiltzea izango da gure lan bakarra.

Rko funtzio bat erabiltzeko, funtzioaren izena erabiliko dugu, eta parentesi artean, funtzio horri dagozkion parametro edo argumentuen balioak definitu beharko ditugu. Ohartu argumentu hauek Rko edozein motako objektuak izan daitezkeela. Adibidez, abs funtzioak, bektore numeriko edo matrize bat hartzen du argumentu bezala eta bertako elementuen balio absolutuak itzultzen ditu:

x <- c(-5:12)
x
##  [1] -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  8  9 10 11 12
abs(x)
##  [1]  5  4  3  2  1  0  1  2  3  4  5  6  7  8  9 10 11 12

Funtzio batzuk, aurrekoak kasu, argumentu bakarra jasotzen dute eta aldiz, beste batzuetan argumentu bat baina gehiago definitu beharko ditugu. Adibidez, seq funtzioak sekuentzia erregularrak sortzeko balio du eta hiru argumentu hartzen ditu: sekuentziaren hasierako balio, sekuentziaren bukaerako balioa eta zenbakien arteko tartea:

seq(from=1, to=10, by=2)
## [1] 1 3 5 7 9

Erabili nahi ditugun funtzioak parametro asko dituztenean do.call funtzioa oso lagungarria izan daiteke. Parametroak zerrenda batean definituz gero, ondoren, do.call funtzioa honela erabil dezakegu era honetan:

args        <- list()
args$from      <- 1
args$to   <- 10
args$by <- 2
do.call(what=seq, args=args)
## [1] 1 3 5 7 9

Exekuzioa berdina da zuzenean edo do.call funtzioa erabiliz, baina hainbat kasutan azken hurbilketarekin kodearen antolaketa txukunagoa izango da. Gainera, parametroen zerrenda hau beste funtzio batekin ere berrerabili dezakegu.

Azkenik, ohartu, ez dela beharrezkoa argumentuen izena funtzioaren deian beti idaztea:

seq(1, 10, 2)
## [1] 1 3 5 7 9

Argumentuen izenak idatzi nahi ez baditugu, kontuz ibili beharko gara argumentuen ordena zehazterakoan; erabiltzen ari garen funtzioak, bere definizioan, finkatuta daukan argumentuen ordenera egokitu beharko gara. Izan ere, ordena aldatu ezkero, ez dugu nahi dugun emaitza lortuko:

seq(2, 10, 1)
## [1]  2  3  4  5  6  7  8  9 10
seq(1, 10, 2)
## [1] 1 3 5 7 9

Funtzio baten argumentuak zeintzuk diren eta zein ordenetan definituta dauden nola ikusi, hurrengo bi ataletan ikasiko dugu.

3.2 Paketeak

Rren ezaugarririk interesgarriena hedagarritasuna da; edonork gara ditzake funtzionalitate berriak dakartzaten paketeak. Beraz, Rko funtzio ezberdinak pakete desberdinetan daude eskuragai.

Rn paketeak instalatzeko bide ofiziala CRAN biltegiaren bitartez da –Comprehensive R Archive Network–. Bertan milaka pakete daude gordeta.6

Biltegi horretan dauden paketeak install.packages aginduarekin instala daitezke. Esate baterako, estatistiko batzuk kalkulatzeko beharko dugun fBasics paketea instalatzeko, ondokoa idatzi behar da R terminalean:

install.packages("fBasics")

CRAN biltegiaz gain, badago oso hedatua dagoen beste bat: Bioconductor –http://bioconductor.org–. Biltegi horretan, bioinformatika arloan garatutako paketeak aurki daitezke gehien bat. Hala ere, pakete orokorrak ere aurki ditzakegu. Bioconductor biltegiaren kasuan paketeen instalazioa pixka bat ezberdina da. Adibidez reshape2 paketea instalatzeko7 adibidez, ondoko kodea exekutatu behar da R terminalean.

source("http://bioconductor.org/biocLite.R")
biocLite("reshape2")

Paketeen instalazioa behin bakarrik egin behar dugu ordenagailu bakoitzean. Hala ere, Rko saio berri bat hasten dugun bakoitzean behar ditugun paketeak kargatu beharko ditugu, hauek erabili ahal izateko. Horretarako library funtzioa erabiliko dugu:

library(fBasics)

3.3 R ren laguntza

Rren funtzio guztiak ezagutu eta haiek erabiltzen jakitea ezinezkoa da, izan ere milaka funtzio daude iada eskuragai eta paketeak denborarekin aldatzen dira, funtzio berriak sortuz, zaharrak ezabatuz, etab.

Beraz, Rko funtzio eta paketeei buruzko informazioa lortzeko Rren laguntza erabili beharko dugu. Horretarako, hainbat bide daude. Erabili nahi dugun funtzioaren izena zehazki ezagutzen badugu, honakoa idatziko dugu Rren terminalean:

help("funtzioaren izena")

Honek zuzenean aukeratutako funtzioaren laguntza orria zabalduko digu, RStudion bagaude eskuineko beheko leihoan eta bestela internet nabigatzailean. Honakoak ere efektu berdina izango du:

?funtzioaren izena

Defektuz, help funtzioak kargatuta dauden paketeetako funtzioen artean egingo du bilaketa. Kargatuta ez daukagun paketeren bateko funtzio baten laguntza behar badugu try.all.packages = TRUE argumentua gehitu beharko dugu help funtzioaren deian:

help("funtzioaren izena", try.all.packages = TRUE)

Funtzioaren izena ez badugu zehazki ezagutzen, help.search() edo ?? erabili ditzakegu, argumentu bezala, bilatu nahi dugunarekin erlazioa duen espresio bat jarriz:

??variance

Hau eginda, bilaketa bat egingo da eta erlazionatuta dauden funtzio, objektu eta pakete guztien zerrenda itzuliko digu Rk. Ondoren, guk, behar duguna aukeratu beharko dugu hau guztiaren artean eta berriro ere laguntza orri batera iritsiko gara.

Rko laguntza orri guztiek egitura berdina dute, honako atal hauetaz osatuta:

  • Description: Hautatutako funtzioak zer egiten duen azaltzen duen lerro pare bat.
  • Usage: Funtzioari dei nola egin diezaiokegun adierazten da, kodea erabiliz.
  • Arguments: Funtzioari zein sarrera argumentu eman behar dizkiogun adierazten da eta haien ordena, bakoitzean zein motako argumentua den azalduz eta defektuzko baliorik duen ala ez zehaztuz. Defektuzko baliorik ez duten argumentuei nahi eta nahiez eman beharko diegu balio bat.
  • Details: Funtzioari buruzko azalpen luzeago bat ematen da, xehetasun garrantzitsu batzuk emanez.
  • Value: Funtzioak irteeran zein balio itzultzen dituen adierazten digu, zer informazio gordetzen duten itzulitako objektuak eta zein motakoak diren adieraziz.
  • References: Funtzioarekin edo bere inplementazioarekin erlazionatutako erreferentzia bibliografikoak aurkezten dira.
  • See Also: Hautatutako funtzioarekin erlazionatutako Rko beste funtzio batzuen zerrenda bat.
  • Examples: Funtzioaren erabileraren adibide batzuk eskeitzen dira.

Guretzako atal garrantzitsuenak Description, Usage, Arguments eta Examples izango dira.

Rren laguntza oso erabilgarria eta lagungarria da, beraz hau ondo erabiltzen jakitea ezinbestekoa da. Gainera, interneten ere informazio ugari dago Rko funtzio eta pakete ezberdinen inguruan. Gogoratu, bai laguntza eta bai interneteko bilaketak egitean ingelesa erabiliz emaitza askoz gehiago eta erabilgarriagoak lortuko ditugula.

3.4 Ohiko funtzioak

Honako taula honetan Rko ohiko funtzio batzuen laburpena egingo dugu.

Ohiko funtzio batzuk
Funtzioa Funtzionalitatea
rm Objektuak ezabatzeko
ls Definituta dauden objektu guztien zerrenda itzultzen du
paste Bi bektore kateatzen ditu eta karaktere bihurtzen ditu.
log, log10, log2 Oinarri ezberdinetako logaritmoak
exp Funtzio esponentziala
sqrt Erro karratua
cos, sin, tan, acos, asin, atan Funtzio trigonometriko ohikoak
seq Sekuentzia erregularrak sortzeko
rep Balio bat hainbat aldiz errepikatuz, bektore bat sortzeko
table Maiztasun taula edo kontingentzia taulak sortzeko
length Bektore edo zerrenda baten luzera ezagutzeko
dim Objektuen dimentsioa ezagutzeko (matrizeak, data frame-ak eta array-ak)
is, mode Objektu baten mota jakiteko
as.numeric, as.character, as.factor Mota batetik bestera castinga egiteko.
na.omit Bektore batean agertzen diren NA balioak ezabatzeko
unique Bektore bateko errepikatzen ez diren elementuak lortzeko
append Bektore bati balioak eransteko
rev Bektore bati buelta emateko, elementuak atzekoz aurrera ordenatuz
sort Bektore bateko elementuak ordenatzeko
order Bektore bateko elementuen ordena itzultzen digu, txikienaren indizea lehenengo eta handienaren indizea azkena jarriz.
sign Bektore bateko elementuen zeinuak itzultzen ditu
floor, ceiling, round, signif, trunc Borobiltzeko funtzioak
max Bektore batean balio maximoa
min Bektore batean balio minimoa
sum Bektore bateko elementuen batura egiteko.
cut Aldagai jarraitu bat tarteetan biltzeko.
which Bektore edo matrize batean aukeratutako baldintzak betetzen dituzten balioen indizeak itzultzen ditu
which.max, which.min Bektore batean balio maximoaren edo minimoaren indizea itzultzen du.
cbind Data frame (edo matrize) bati zutabeak gehitzeko
rbind Data frame (edo matrize) bati errenkadak gehitzeko
t Matrize baten transposatua.
diag Matrize baten diagonala atzitzeko edo matrize diagonal bat sortzeko
subset Bektore, matrize edo data frame batean, definitutako baldintzak betetzen dituzten indibiduoak aukeratzeko
rowMeans Matrize edo data frame baten errenkaden batezbestekoak kalkulatzeko.
rowSums Matrize edo data frame baten errenkaden batukariak kalkulatzeko.
colMeans Matrize edo data frame baten zutabeen batezbestekoak kalkulatzeko.
colSums Matrize edo data frame baten zutabeen baturak kalkulatzeko.
summary Data frame baten aldagai guztien edo aldagai konkretu baten estatistiko garrantzitsuenen laburpen bat
cumsum Bektore batean batuketa metakorrak egiten ditu.
cumprod Bektore batean biderkaketa metakorrak egiten ditu.

Funtzio guzti hauen erabilera hobeto ezagutu nahi badugu eta zenbait adibide ikusi nahi baditugu, R ren laguntzara jo dezakegu aurreko atalean azaldu bezala.

3.4.1 Estatistikoak kalkulatzeko funtzioak

Bereziki, goian aipatutako funtzioez gain, oinarrizko estatistikoak kalkulatzeko honako funtzio hauek erabili ditzakegu:

Ohiko estatistikoak kalkulatzeko funtzioak
Funtzioa Funtzionalitatea
mean Batezbestekoa
var Kuasibariantza
sd Kuasi desbiderapen estandarra
median Mediana
quantile Pertzentil, kuantil eta dezilak
range Heina
skewness Asimetria koefizientea (timeDate paketean)
kurtosis Kurtosia (timeDate paketean)
ineq Gini-ren indizea (ineq paketean)
Lc Lorenz-en kurba irudikatzeko (ineq paketean)

Beste zenbait estatistiko, adibidez moda, bariantza, desbiderapen estandarra eta alborapena, hauei aurreko gaietan ikasi ditugun eragiketak eta transformazioak aplikatuta eta funtzio berriak sortuz lor ditzakegu, hurrengo atalean azalduko dugun moduan.

Adibidez, Rn aurki dezakegun iris datu baseko Sepal.Width aldagaiaren estatistiko batzuk kalkulatu ditzakegu:

library(timeDate)
library(ineq)
mean(iris$Sepal.Width)
## [1] 3.057333
quantile(iris$Sepal.Width)
##   0%  25%  50%  75% 100% 
##  2.0  2.8  3.0  3.3  4.4
skewness(iris$Sepal.Width)
## [1] 0.3126147
## attr(,"method")
## [1] "moment"
ineq(iris$Sepal.Width)
## [1] 0.07915104
Lorenz <- Lc(iris$Sepal.Width, plot=TRUE)

Ohartu, aurreko kodea exekutatu ahal izateko timeDate eta ineq paketeak instalatuta izan behar direla.

Azkenik, aldagai jarraitu baten estatistikoak beste aldagai baten arabera kalkulatzeko aggregate funtzioa erabil dezakegu. Adibidez, honako kodeak Sepal.Width aldagaiaren asimetria koefizientea kalkulatzen du, Species aldagaiaren arabera.

aggregate(iris$Sepal.Width, by=list(iris$Species), FUN=skewness)
##      Group.1           x
## 1     setosa  0.03872946
## 2 versicolor -0.34136443
## 3  virginica  0.34428489

3.5 Funtzio berriak sortzea

Rko funtzioak erabiltzeaz gain, behar denean, guk ere geure funtzio propioak definitu eta eraiki ditzakegu. Funtzioak sortzeko function funtzioa erabiltzen da era honetan:

funtzioaren.izena <- function(argumentuak){
  
  Aginduak
  
  return(objektua)
}

Adibidez, hurrengo adibidean cm-tan neurturako pertsonen altueren bektore bat metrotara pasatzen dugu:

conversion1 <- function(x){
  x/100
}

x <- c(165, 170, 155)
conversion1(x)
## [1] 1.65 1.70 1.55

Funtzioek, implementatzen duten azken aginduaren emaitza itzultzen dute. Edonola ere, nahi izanez gero, return agindua erabili daiteke, funtzioaren emaitza esplizituki adierazteko.

conversion1 <- function(x){
  return(x/100)
}

Ohartu, funtzioak sortzean bere argumentuak erazagutu edo definitu behar direla. Hauek izen bat izan behar dute eta balio lehenetsi (defektuzko balio) bat ere izan dezakete, nahi badugu. Adibidez, jarraian definituko dugun funtzioak cm-tan dagoen bektore bat metrotara pasako du, baina gainera, emaitzaren digitu dezimal konpurua kontrolatu ahalko dugu digituak izeneko argumentu baten bidez:

conversion2 <- function(x, digituak=1){
  m <- x/100
  round(m, digits=digituak)
}

x <- c(165, 170, 155)
conversion2(x)
## [1] 1.6 1.7 1.6
conversion2(x, digituak=2)
## [1] 1.65 1.70 1.55

Balio lehenetsirik ez duten parametroei, x kasu honetan, derrigorrez eman behar zaie balio bat funtzioa erabiltzean. Argumentu horiei balioa eman ezean, interpreteak errore bat jaurtizen du. Aldiz, balio lehenetsia daukaten parametroak ez ditugu zertan definitu, baliorik esleitu ezean Rk defektuzko balioa erabiliko baitu. Gainera, ohartu, funtzio baten barnean, beste funtzioei deitu diezaiekegula: kasu honetan round funtzioa erabili dugu zenbaki erreal bat borobiltzeko balio duena.

3.6 Ariketak

1. Ariketa Erabili laguntza sample funtzioa ezagutzeko. Zein parametro hartzen ditu sarreran? Hauetako baten batek ba al du defektuko baliorik? Zein balio itzultzen ditu? Zein motakoak dira objektu hauek? Sortu adibide bat, laguntza orrian agertzen denaren ezberdina, funtzio honen erabilera erakusteko.

2. Ariketa Jarraitu honako pausuak, bakoitzean soilik funtzio bat erabiliz:

  • Definitu ezazu \(x=(5, 4, 3, 2, 1)\) bektorea seq funtzioa erabiliz.
  • Ordenatu \(x\) bektorea balio txikienetik handienera eta gorde y izeneko aldagaian.
  • Gehitu y bektoreari 2 eta 4 balioak bukaeran.
  • Aukeratu y bektorean errepikatzen ez diren elementuak eta gorde z bektorean.

3. Ariketa Kalkulatu honakoa \(\sum_{i=10}^{100} (i^2+4i^5)\).

4. Ariketa Kalkulatu \(x=(1,4,2,4,6,1)\) bektorearen batezbestekoa 2 modu ezberdinetan:

  • R n iada definituta dagoen funtzio bat erabiliz.
  • Zuk definitutako funtzio bat erabiliz (OHARRA: Kontuan izan, bektoreak balio galduak baditu, hauek batezbestekoa kalkulatu aurretik kendu beharko ditugula. ).

5. Ariketa Definitu funtzio bat, bektore baten desbiderapen estandarra (\(s_n\)) kalkulatuko duena eta erabili funtzio hau \(x=(9,8,1,3,5,1,3,5,1,4)\) bektorearen desbiderapen estandarra kalkulatzeko. (OHARRA: Kontuan izan, bektoreak balio galduak baditu, hauek batezbestekoa kalkulatu aurretik kendu beharko ditugula. )

6. Ariketa Egin aurreko ariketa berriro, horretarako Rn definitutako sd funtzioak itzulitako baliotik abiatuz. (OHARRA: Kontuan izan, bektoreak balio galduak baditu, hauek batezbestekoa kalkulatu aurretik kendu beharko ditugula. )

7. Ariketa Definitu datu bektore baten taula estatistikoa eraiki eta itzultzen duen funtzio bat, \(x_i\), \(f_i\), \(F_i\), \(h_i\) eta \(H_i\) zutabeak dituena. Horretarako, goian azaldutako ohiko funtzio batzuetaz baliatu beharko zarete. Ondoren, erabili funtzio hori \(x=(9,8,1,3,5,1,3,5,1,4)\) laginaren taula lortzeko.

8. Ariketa Sortu bektore baten moda kalkulatuko duen funtzio bat eta, hau erabiliz, alborapena kalkulatuko duen beste funtzio bat. Kalkulatu funtzio hauek erabiliz \(x=(9,8,1,3,5,1,3,5,1,4)\) laginaren moda eta alborapena.

9. Ariketa iris datu basea Rn berez dagoen data frame bat da. Berau erabiliz egin honako ariketak:

  • Aztertu zein motakoak diren aldagai guztiak is funtzioa erabiliz.
  • Kalkulatu aldagai jarraitu guztien batezbestekoak Rko agindu bakar bat erabiliz.
  • Kalkulatu Petal.Width izeneko aldagaiaren batezbesteko geometrikoa.
  • Sortu aldagai berri bat Petal.Width2 izenekoa, aldagai hau tarteetan banatzen duena eta kualitatibo bihurtzen duena (OHARRA: erabili cut funtzioa).

  1. Zerrenda osoa http://cran.r-project.org/web/packages/index.html helbidean dago.

  2. Datu egiturak maneiatzeko eta eraldatzeko erabili daiteke pakete hau.