Mostrando las entradas con la etiqueta sapply. Mostrar todas las entradas
Mostrando las entradas con la etiqueta sapply. Mostrar todas las entradas

sábado, 14 de septiembre de 2013

Funciones para obtener sub-muestras en R

Lapply, sapply, apply, tapply

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()

plot of chunk unnamed-chunk-2

dotchart(sort(sapply(cancer[, 2:12], median)))
grid()

plot of chunk unnamed-chunk-2

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