4  Az R programozása

Programozás.

data(birthwt, package = "MASS")

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
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.16
sd( birthwt$bwt[ 1:100 ] )
[1] 323.7243
elsoszazf <- function( data, f = mean ) {
  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