Lapply, sapply, apply, tapply
R posee una serie de funciones que nos ayudan a operar sobre todo cuando trabajamos en la cónsola de forma tal que no empleemos loops. Estas funciones son:
- lapply
- sapply
- apply
- tapply
Veamos algunos ejemplos sobre cómo aplicarlas.
Lapply, sapply
opera sobre una lista, o un objeto que se forza a ser lista, y aplica una función dada sobre ella. Devuelve una lista también. Sapply funciona como lapply pero devuelve un vector en lugar de una lista.Ejemplo: Queremos aplicar la media a la base de datos sobre la incidencia del cancer en el mundo. Como tengo algunas columnas que no son numérica, elijamos sólo algunas de aquellas que lo son
lapply(cancer[, 2:6], mean)
## $cervica
## [1] 6.671
##
## $colon.recto
## [1] 9.06
##
## $esofago
## [1] 4.195
##
## $higado
## [1] 8.329
##
## $leucemia
## [1] 3.69
sapply(cancer[, 2:6], mean)
## cervica colon.recto esofago higado leucemia
## 6.671 9.060 4.195 8.329 3.690
Dependiendo sobre cuál formato nos resulte más conveniente como resultado, emplearemos lapply o sapply. Podemos aplicar la funcion sapply para crear un grafico, por ejemplo un dotchart
dotchart(sort(sapply(cancer[, 2:12], mean)))
grid()
dotchart(sort(sapply(cancer[, 2:12], median)))
grid()
Apply, tapply
Apply es una función que se aplica sobre todo a los márgenes de una matriz. Tapply nos permite segmentar una matriz de datos de acuerdo con algunos factores y aplicar una función de acuerdo con los factores. Aplicamos primero la función apply a la data numérica de la base de dato cáncer para obtener la distribución por cuartiles. El primer argumento indica la data a la que se aplicará la función, el segundo indica que se desea que se aplique la función a las columnas, y, finalmente, se indica qué función deseamos. Después, aplicaremos la función tapply para obtener la media por regiones de la incidencia del cáncer cervical.
apply(cancer[, 2:6], 2, quantile, probs = (c(0.25, 0.5, 0.75)))
## cervica colon.recto esofago higado leucemia
## 25% 2.2 4.30 1.4 3.80 2.6
## 50% 5.2 7.10 2.6 5.60 3.9
## 75% 9.5 13.15 5.1 9.85 4.7
tapply(cancer[, 2], cancer$region, mean)
## aao asia ca caribbean europe menaga na
## 7.719 4.944 8.429 6.879 2.873 1.909 1.200
## sa ssa
## 7.192 13.107
Si deseamos obtener no sólo la aplicación de una función de acuerdo con los niveles de un factor dado a una variable sino a un grupo de ellas o a toda la base de datos empleamos la función strit() en combinación con cualquiera de las funciones anteriores. Veamos cómo funciona split:
z <- split(cancer, cancer$region)
head(z, 4)
## $aao
## pais cervica colon.recto esofago higado leucemia mama oral
## 10 australia 1.0 13.0 3.9 3.4 5.1 18.2 2.2
## 41 cook islands 4.6 2.2 1.0 7.7 2.8 7.3 1.4
## 59 fiji 10.4 6.0 9.5 7.3 3.7 18.3 2.3
## 89 kiribati 4.9 0.0 2.7 6.0 2.0 20.0 7.8
## 106 marshall isl. 11.2 3.7 1.4 14.1 6.3 19.5 3.0
## 110 micronesia 8.3 3.6 4.0 8.3 2.6 11.9 13.4
## 118 nauru 21.4 5.4 30.3 5.4 3.1 25.7 1.9
## 121 new guinea 9.8 6.5 4.1 11.0 2.6 13.1 17.3
## 122 new zealand 1.2 20.4 3.9 3.3 5.2 21.5 2.1
## 126 niue 6.6 3.0 1.1 10.3 4.8 11.0 1.9
## 131 palau 9.0 3.7 1.5 11.9 4.0 17.1 2.5
## 145 samoa 2.7 3.7 0.0 4.7 2.8 1.5 1.6
## 156 solomon isl. 5.9 4.8 5.3 8.2 3.6 12.2 1.6
## 174 tonga 8.0 3.1 1.0 9.8 3.5 13.2 2.0
## 179 tuvalu 13.3 3.8 1.4 15.1 7.3 24.0 3.6
## 186 vanuatu 5.2 4.6 0.0 15.9 7.1 13.4 3.0
## ovario pancreas pulmon vejiga gdpcapita region
## 10 2.5 6.2 23.0 2.8 24.753 aao
## 41 2.4 1.1 8.5 0.6 13.478 aao
## 59 4.2 1.5 6.1 1.4 4.391 aao
## 89 0.0 0.0 4.9 0.0 1.803 aao
## 106 6.6 1.9 13.6 0.7 3.448 aao
## 110 2.4 0.9 3.7 0.6 2.855 aao
## 118 2.7 2.5 19.9 0.8 7 aao
## 121 1.9 0.8 7.4 1.3 1.794 aao
## 122 3.2 6.7 24.3 2.6 36.874 aao
## 126 3.1 1.6 11.8 0.6 5.800 aao
## 131 5.1 1.6 12.6 0.6 11.096 aao
## 145 0.0 1.7 3.7 0.0 3.629 aao
## 156 2.8 1.1 6.7 0.9 1.518 aao
## 174 4.3 1.6 11.1 0.5 4.335 aao
## 179 8.4 2.2 15.6 0.8 24.363 aao
## 186 1.5 2.1 11.0 1.1 3.168 aao
##
## $asia
## pais cervica colon.recto esofago higado leucemia mama oral
## 15 bangladesh 9.5 3.7 8.0 4.1 0.9 14.7 12.5
## 21 bhutan 5.5 6.2 10.4 7.0 5.5 4.8 14.2
## 26 brunei 2.1 12.5 0.8 3.2 2.6 15.7 2.0
## 30 cambodia 10.9 6.5 2.5 15.9 3.9 8.9 8.0
## 37 china 2.4 8.4 15.5 27.0 4.1 6.4 2.5
## 77 india 8.1 3.2 5.3 2.3 2.6 12.3 10.7
## 78 indonesia 4.0 15.1 1.6 7.2 4.9 20.2 6.6
## 85 japan 1.5 14.7 4.3 11.1 3.1 10.5 2.5
## 87 kazakhstan 5.6 13.3 10.3 8.1 4.5 20.7 3.8
## 91 kyrgyzstan 6.5 8.2 5.3 8.6 3.1 15.6 3.9
## 92 laos 7.7 6.3 1.4 35.1 3.8 7.7 6.3
## 102 malaysia 3.1 13.1 2.2 5.9 4.5 15.8 7.7
## 103 maldives 4.5 23.8 6.7 41.8 6.2 13.1 3.5
## 113 mongolia 6.1 4.9 18.6 86.9 1.7 3.8 2.8
## 116 myanmar 8.8 8.4 7.8 11.6 4.3 13.5 7.3
## 119 nepal 9.9 4.2 3.8 1.5 4.4 12.9 9.7
## 127 north korea 2.1 10.9 3.3 11.7 2.3 11.5 1.5
## 135 philippines 3.0 5.4 1.1 11.0 3.4 13.1 5.0
## 153 singapore 2.4 18.1 2.6 11.3 3.4 16.9 5.4
## 159 south korea 1.9 12.6 2.8 19.5 2.9 5.5 1.7
## 161 sri lanka 4.0 5.7 9.1 1.7 5.2 14.9 11.8
## 169 tajikistan 2.5 3.4 12.6 5.3 1.1 9.2 2.5
## 171 thailand 7.6 7.7 1.7 28.0 3.7 11.8 6.2
## 172 timor-leste 5.0 13.7 0.9 9.4 4.8 20.8 5.6
## 178 turkmenistan 2.3 6.3 11.3 7.8 2.5 17.1 5.2
## 185 uzbekistan 3.1 3.6 5.5 5.1 2.7 11.0 2.5
## 188 viet nam 3.4 5.8 1.6 29.7 4.4 6.0 5.3
## ovario pancreas pulmon vejiga gdpcapita region
## 15 1.7 0.5 20.3 1.4 19.512 asia
## 21 3.3 3.9 9.6 2.0 2.336 asia
## 26 1.9 2.7 29.5 3.0 40.301 asia
## 30 1.8 1.7 16.4 1.7 897 asia
## 37 0.8 3.0 33.5 1.6 5.439 asia
## 77 2.3 1.0 6.5 1.1 1.528 asia
## 78 3.7 3.1 20.5 2.7 3.495 asia
## 85 1.9 8.6 21.3 1.9 46.407 asia
## 87 3.8 7.3 25.7 2.6 11.503 asia
## 91 3.4 4.8 15.2 1.9 1.098 asia
## 92 2.1 1.3 21.0 1.9 1.303 asia
## 102 2.8 2.3 17.9 1.8 9.977 asia
## 103 3.5 14.1 42.1 4.8 6.405 asia
## 113 1.3 3.3 21.2 1.2 3.060 asia
## 116 2.5 1.4 18.3 2.1 1.300 asia
## 119 4.4 1.6 19.4 2.0 607 asia
## 127 1.8 4.1 30.0 2.2 1.800 asia
## 135 1.6 2.0 15.5 0.6 2.370 asia
## 153 2.3 5.3 27.5 1.5 50.087 asia
## 159 1.3 6.6 27.3 2.0 30.205 asia
## 161 3.7 0.6 7.2 0.8 2.812 asia
## 169 1.2 2.1 6.6 1.2 935 asia
## 171 2.2 1.3 17.2 1.6 5.318 asia
## 172 3.6 3.1 19.6 3.2 3.100 asia
## 178 1.8 3.5 11.4 1.9 5.042 asia
## 185 0.9 1.6 7.7 1.2 1.641 asia
## 188 0.5 0.7 24.7 0.4 1.392 asia
##
## $ca
## pais cervica colon.recto esofago higado leucemia mama oral
## 42 costa rica 3.8 11.3 1.6 5.2 5.7 17.6 2.7
## 54 el salvador 11.3 3.5 1.5 6.0 3.5 7.0 1.6
## 69 guatemala 8.9 3.7 1.7 17.7 3.1 6.2 2.2
## 74 honduras 11.1 5.2 2.1 16.1 4.2 8.3 2.4
## 109 mexico 5.0 5.3 1.3 6.4 4.1 11.3 1.2
## 123 nicaragua 11.7 5.6 1.0 10.0 4.2 9.5 1.4
## 132 panama 7.2 9.2 1.8 4.6 4.9 13.0 1.7
## ovario pancreas pulmon vejiga gdpcapita region
## 42 1.8 4.2 6.9 1.9 8.676 ca
## 54 1.6 2.9 6.2 0.7 3.702 ca
## 69 0.9 2.9 7.1 0.5 3.178 ca
## 74 1.4 3.9 8.9 0.7 2.250 ca
## 109 2.0 4.6 8.6 1.4 10.063 ca
## 123 1.7 3.7 6.9 0.7 1.243 ca
## 132 1.9 4.4 12.0 1.1 2.112 ca
##
## $caribbean
## pais cervica colon.recto esofago higado leucemia mama oral
## 6 antigua and bar. 5.4 13.6 4.6 5.2 4.0 29.8 2.7
## 13 bahamas 4.7 10.8 3.4 3.3 4.1 27.7 4.1
## 16 barbados 6.0 19.8 3.8 4.4 4.1 25.4 3.8
## 19 belize 8.1 5.5 2.4 9.7 3.5 12.5 0.2
## 45 cuba 4.5 14.1 4.2 4.7 4.1 18.2 4.5
## 50 dominica 9.9 10.8 3.7 3.8 4.9 27.0 5.7
## 51 dominican rep 7.6 6.8 1.6 9.3 3.7 13.3 4.3
## 68 grenada 4.6 6.4 7.9 6.5 2.0 23.3 4.3
## 73 haiti 6.7 7.1 2.3 7.9 1.9 12.1 1.4
## 84 jamaica 11.8 9.7 3.3 4.4 2.6 24.8 2.2
## 143 saint lucia 7.3 6.2 2.7 4.0 4.5 14.6 5.2
## 144 saint vincent 9.9 6.0 1.2 3.6 3.0 18.0 6.0
## 162 st. kitts 1.8 15.1 0.0 10.2 5.2 36.1 4.7
## 175 trinidad/tob. 8.0 12.2 1.7 2.6 4.0 22.1 2.4
## ovario pancreas pulmon vejiga gdpcapita region
## 6 8.5 3.4 8.3 3.1 12.480 caribbean
## 13 3.3 1.9 9.7 1.5 6.813 caribbean
## 16 2.1 5.0 6.1 0.8 706 caribbean
## 19 0.8 3.2 12.7 1.1 47.807 caribbean
## 45 1.7 5.4 33.8 3.7 6.106 caribbean
## 50 0.0 4.5 10.9 2.6 7.322 caribbean
## 51 0.7 3.4 12.1 0.6 5.512 caribbean
## 68 2.6 7.7 13.2 1.8 7.868 caribbean
## 73 1.4 3.8 8.0 1.2 665 caribbean
## 84 1.6 4.7 16.2 2.9 5.360 caribbean
## 143 2.7 3.8 10.0 2.6 7.124 caribbean
## 144 1.0 4.2 6.9 0.3 6.291 caribbean
## 162 1.6 8.7 5.4 3.2 15.154 caribbean
## 175 4.3 5.9 9.6 1.4 16.272 caribbean
En combinación con sapply:
regiones <- split(cancer, cancer$region)
sapply(regiones, function(x) colMeans(x[, c("cervica", "higado", "leucemia",
"mama", "ovario", "pulmon")]))
## aao asia ca caribbean europe menaga na sa ssa
## cervica 7.719 4.944 8.429 6.879 2.873 1.909 1.20 7.192 13.107
## higado 8.900 15.474 9.429 5.686 4.791 3.896 3.40 5.400 11.152
## leucemia 4.156 3.574 4.243 3.686 4.595 4.243 5.05 4.158 2.189
## mama 15.494 12.385 10.414 21.779 19.652 16.704 19.50 15.800 14.648
## ovario 3.194 2.300 1.614 2.307 3.270 1.865 3.15 2.133 1.891
## pulmon 11.494 19.744 8.086 11.636 27.584 10.883 34.55 13.300 3.789
No hay comentarios.:
Publicar un comentario