5 . fejezet Az R programozása

Programozás.

5.1 Funkcionális programozás

Az R, bár többféle paradigmában is tud dolgozni, érezhető funkcionális nyelv. Ezt elegáns is, célszerű is kihasználni!

Egy példa:

mean(birthwt$bwt[1:100])
## [1] 3130
elsoszazatlag <- function(data) {
    result <- mean(data[1:100])
    return(result)
}

elsoszazatlag <- function(data) {
    result <- mean(data[1:100])
    result
}
elsoszazatlag <- function(data) {
    mean(data[1:100])
}

elsoszazatlag(birthwt$bwt)
## [1] 3130
sd(birthwt$bwt[1:100])
## [1] 324
elsoszazf <- function(data, f = mean) {
    f(data[1:100])
}
elsoszazf(birthwt$bwt)
## [1] 3130
elsoszazf(birthwt$bwt, f = sd)
## [1] 324

A lapply az első argumentumban megadott lista minden elemére ráereszti a második argumentumban megadott függvényt, és az eredményt összefűzi egy listává (a sapply csak annyiban tér el, hogy lista helyett vektort ad vissza, ha lehetséges a listát vektorrá konvertálni):

lapply(c("age", "lwt", "bwt"), nchar)
## [[1]]
## [1] 3
## 
## [[2]]
## [1] 3
## 
## [[3]]
## [1] 3
sapply(c("age", "lwt", "bwt"), nchar)
## age lwt bwt 
##   3   3   3
lapply(c("age", "lwt", "bwt"), function(x) nchar(x))
## [[1]]
## [1] 3
## 
## [[2]]
## [1] 3
## 
## [[3]]
## [1] 3
lapply(c("age", "lwt", "bwt"), function(x) mean(birthwt[[x]]))
## [[1]]
## [1] 23
## 
## [[2]]
## [1] 130
## 
## [[3]]
## [1] 2945
sapply(c("age", "lwt", "bwt"), function(x) mean(birthwt[[x]]))
##  age  lwt  bwt 
##   23  130 2945
sapply(birthwt, mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
##   low   age   lwt  race smoke   ptl    ht    ui   ftv   bwt   nev 
## 3e-01 2e+01 1e+02 2e+00 4e-01 2e-01 6e-02 1e-01 8e-01 3e+03    NA
lapply(birthwt, function(x) c(mean(x), median(x)))
## Warning in mean.default(x): argument is not numeric or logical: returning NA
## $low
## [1] 0.3 0.0
## 
## $age
## [1] 23 23
## 
## $lwt
## [1] 130 121
## 
## $race
## [1] 2 1
## 
## $smoke
## [1] 0.4 0.0
## 
## $ptl
## [1] 0.2 0.0
## 
## $ht
## [1] 0.06 0.00
## 
## $ui
## [1] 0.1 0.0
## 
## $ftv
## [1] 0.8 0.0
## 
## $bwt
## [1] 2945 2977
## 
## $nev
## [1] NA  "a"

A harmadik sor példát mutat arra, hogy anonim függvény is használható, az utolsó előtti pedig arra, hogy a data.frame igazából lista, aminek az elemei az oszlopai.

Az apply az első argumentumban megadott mátrix vagy adatkeret minden sorára vagy oszlopára (ezt a második argumentum dönti el) ráereszti a harmadik argumentumban megadott függvényt:

apply(birthwt, 2, mean)
## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA

## Warning in mean.default(newX[, i], ...): argument is not numeric or logical:
## returning NA
##   low   age   lwt  race smoke   ptl    ht    ui   ftv   bwt   nev 
##    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
apply(birthwt, 1, function(x) x[1])
##  85  86  87  88  89  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
## 106 107 108 109 111 112 113 114 115 116 117 118 119 120 121 123 124 125 126 127 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
## 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
## 148 149 150 151 154 155 156 159 160 161 162 163 164 166 167 168 169 170 172 173 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
## 174 175 176 177 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 195 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
## 196 197 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" 
## 217 218 219 220 221 222 223 224 225 226   4  10  11  13  15  16  17  18  19  20 
## "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" 
##  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  40  42  43  44 
## "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" 
##  45  46  47  49  50  51  52  54  56  57  59  60  61  62  63  65  67  68  69  71 
## "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" 
##  75  76  77  78  79  81  82  83  84 
## "1" "1" "1" "1" "1" "1" "1" "1" "1"

A tapply az első argumentumban megadott változó második argumentum szerint képezett csoportjaira ráereszti a harmadik argumentumban megadott függvényt:

mean(birthwt$bwt[birthwt$race == 1])
## [1] 3103
tapply(birthwt$bwt, birthwt$race, mean)
##    1    2    3 
## 3103 2720 2805