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
<- function(data) {
elsoszazatlag <- mean(data[1:100])
result return(result)
}
<- function(data) {
elsoszazatlag <- mean(data[1:100])
result
result
}<- function(data) {
elsoszazatlag mean(data[1:100])
}
elsoszazatlag(birthwt$bwt)
## [1] 3130
sd(birthwt$bwt[1:100])
## [1] 324
<- function(data, f = mean) {
elsoszazf 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