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

No hay comentarios: