data(birthwt, package = "MASS")
4 Az R programozása
Programozás.
4.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.16
<- 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.16
sd( birthwt$bwt[ 1:100 ] )
[1] 323.7243
<- function( data, f = mean ) {
elsoszazf f( data[ 1:100 ] )
}elsoszazf( birthwt$bwt )
[1] 3130.16
elsoszazf( birthwt$bwt, f = sd )
[1] 323.7243
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.2381
[[2]]
[1] 129.8148
[[3]]
[1] 2944.587
sapply( c( "age", "lwt", "bwt" ), function( x ) mean( birthwt[[ x ]] ) )
age lwt bwt
23.2381 129.8148 2944.5873
sapply( birthwt, mean )
low age lwt race smoke ptl
3.121693e-01 2.323810e+01 1.298148e+02 1.846561e+00 3.915344e-01 1.957672e-01
ht ui ftv bwt
6.349206e-02 1.481481e-01 7.936508e-01 2.944587e+03
lapply( birthwt, function( x ) c( mean( x ), median( x ) ) )
$low
[1] 0.3121693 0.0000000
$age
[1] 23.2381 23.0000
$lwt
[1] 129.8148 121.0000
$race
[1] 1.846561 1.000000
$smoke
[1] 0.3915344 0.0000000
$ptl
[1] 0.1957672 0.0000000
$ht
[1] 0.06349206 0.00000000
$ui
[1] 0.1481481 0.0000000
$ftv
[1] 0.7936508 0.0000000
$bwt
[1] 2944.587 2977.000
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 )
low age lwt race smoke ptl
3.121693e-01 2.323810e+01 1.298148e+02 1.846561e+00 3.915344e-01 1.957672e-01
ht ui ftv bwt
6.349206e-02 1.481481e-01 7.936508e-01 2.944587e+03
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] 3102.719
tapply( birthwt$bwt, birthwt$race, mean )
1 2 3
3102.719 2719.692 2805.284