viernes, 27 de septiembre de 2013

Más sobre extracción de información en R

Pre-procesamiento de datos. Indezación

Pre-procesamiento de datos.
Indezación

De manera general R guarda los datos en lo que se denomina data frame, algo similar a una matriz de datos para las personas acostumbradas a usar SPSS o a una hoja de cálculo para las personas acostumbradas a trabajar con, por ejemplo, Excel. En la etapa de pre-procesamiento de datos, o incluso durante el análisis o modelado de datos, posiblemente necesitemos trabajar con parte de la data. En ese caso debemos emplear algunos procedimientos para obtenerla. En este post elaboraremos algunos ejemplos sobre cómo extraer información de un data frame, si bien es posible seguir el mismo procedimiento para extraer información de otros objetos de R tales como matrices, vectores, listas y arrays.

En una data frame las observaciones, esto es los casos, están en las filas y las variables en las columnas:

cancer[1:10, 3:7]
##    cervical colon.recto esofago higado leucemia
## 1       2.6         6.5     9.7    3.8      5.3
## 2       1.5         7.1     2.4    6.7      5.7
## 3       3.4         8.5     0.5    1.3      2.9
## 4       0.8        14.3     2.5    4.9      3.8
## 5      12.5         3.5     4.0    9.6      1.8
## 6       5.4        13.6     4.6    5.2      4.0
## 7       0.0         5.1     1.9    3.6      2.8
## 8       5.2        17.1     4.8    4.1      4.4
## 9       5.5        12.7     1.4   11.7      5.0
## 10      1.0        13.0     3.9    3.4      5.1

Las variables en R pueden ser numéricas, cualitativas o boleanas. Las variables numéricas tienen dos clases: integer para cantidades discretas, y double para las cantidades continuas. Los factores corresponden a variables cualitativas que contienen categorías; los caracteres, a cadenas de textos, se trate de una sola letra o de un conjunto de ellas. Finalmente las variables boleanas toman valores lógicos. Veamos que variables, y de qué tipo hay, en el data frame anterior:

table(sapply(cancer[1, ], class))
## 
##  factor numeric 
##       4      11

Los nombres de las variables de un data frame pueden obtenerse bien mediante la función name() o bien mediante colname() . con estas mismas funciones se puede cambiar el nombre de las variables o modificar su presentación. Las filas generalmente se enumeran en los data frames.Por consiguiente, cuando se escribe rownames()se obtiene esta numeración. En ocasiones es conveniente sustituir estos números con nombres que tengan sentido.

names(cancer[1:10, 3:7])
## [1] "cervical"    "colon.recto" "esofago"     "higado"      "leucemia"
colnames(cancer[1:10, 3:7])
## [1] "cervical"    "colon.recto" "esofago"     "higado"      "leucemia"
rownames(cancer[1:10, 3:7])
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

Cuando analizamos una base de datos, no siempre deseamos trabajar sobre toda la base. En esos casos debemos extraer muestras o, si sólo nos interesa una parte, subconjunto de datos.

subconjuntos y muestras

Indezación directa

De la data de cancer, por ejemplo, nos puede interesar obtener sólo las variables numéricas para generar una gráfica de caja y bigotes. La base posee 191 casos y 15 variables. En los ejemplos anteriores hemos obtenido un subconjunto de datos de la base de datos sobre cáncer. Hemos pedidos los diez primeros casos cancer[1:10,] y sólo de la tercera hasta la séptima variable cancer[,3:7]. La extracción del subconjunto que satisface esta condición se logra, entonces, aplicando cancer[1:10,3:7]. La condición deseada se coloca entre corchetes, y que la primera sentencia dentro de los corchetes, esto es, la operación para extraer las filas, es la primera que se establece. Después escribimos las condiciones para extraer las columnas. Si nos interesan todos los casos, pero sólo algunas variables, no escribimos nada del lado de las fila:


boxplot(cancer[, 3:13], las = 2, border = paleta)
grid()

plot of chunk tiposCancer

En el gráfico anterior, estamos solicitando que se elaboren las cajas y bigote para las variables 3 a la 13 con información para todos los casos. La forma de extraer información funciona tanto si queremos formar una nueva base de datos o aplicar ad hoc algún procedimiento a ese subconjunto de datos, como por ejemplo elaborar una grafica. Si las variables o casos que deseamos no son consecutivos, podemos crear un subvector para obtenerlos. Supongamos que sólo nos interesa obtener información las regiones (variable 2) y sólo con la data correspondiente a leucemia (variable 7) y cancer de ovarios (variable 10) :

cancer[c(2, 7, 10)]

Nótese que la condición para extraer la data se escribe igual, entre corchetes, y, dentro de estos, se escribe el vector deseado. Observese igualmente que el vector va precedido de c(), el indicativo en el contexto de R de que estamos creando un vector. También podemos excluir elementos. Un código con el que se obtiene la misma informacion anterior, pero que definitivamente requiere escribir más es:

cancer[1:191, -c(1, 3:6, 8:9, 11:15)]

En R también es posible extraer información usando los nombres de las variables, en ese caso, el nombre de la variable debe ir precedido del nombre del data frame donde está ubicada la variables

cancer$ovario
# es equivalente a escribir cancer[,10] o cancer[,'ovario']

Por lo que es totalmente factible extraer información empleando el siguiente código:

cancer[, "ovario", "cervial", "leucemia"]

En este caso obtendremos tres variables, en el orden solicitado medida para todos los casos. El mismo procedimiento se puede seguir para extraer casos. Por ello la recomendación que haciamos inicialmente de darle a las filas nombres que tengan sentido y no quedarse con la enumeración que por defecto asigna R a cada uno de los casos. Cuando los data frame son considerablemente grandes, es mejor buscar y extraer casos por nombre que por número.

El proceso de extraer información siguiendo todo el procedimiento anterior se denomina indezación directa. En R también es posible extraer datos de un data frame empleando condiciones lógicas.

Indización por condición.

Este tipo de extracción emplea ampliamente los operadores lógicos de R para obtener la información deseada. Supongamos que deseamos saber de la bae de datos sobre cáncer qué casos pertenecen a la región “america”:

which(cancer$region == "america")
##  [1]   6   8  13  16  19  22  25  32  36  38  42  45  50  51  52  54  68
## [18]  69  72  73  74  84 109 123 132 133 134 143 144 162 164 175 183 184
## [35] 187

El operador == en R significa es igual a. Debe ser un signo de igual doble. La función which() puede emplearse también para obtener cual columna tiene cierto nombre y escoger o dejarla fuera de la selección:

which(colnames(cancer) == "ovario")
## [1] 10

Si por ejemplo nos interesa extraer solo los casos:

  • región “america”,
  • region “america” con tasas iguales o mayores a la mediana cancer de mama
cancer[cancer$region == "america", ]
##                 pais  region cervical colon.recto esofago higado leucemia
## 6   antigua and bar. america      5.4        13.6     4.6    5.2      4.0
## 8          argentina america      5.2        17.1     4.8    4.1      4.4
## 13           bahamas america      4.7        10.8     3.4    3.3      4.1
## 16          barbados america      6.0        19.8     3.8    4.4      4.1
## 19            belize america      8.1         5.5     2.4    9.7      3.5
## 22           bolivia america      9.3         4.3     0.9    5.1      3.7
## 25            brazil america      6.5         7.1     4.8    5.4      3.8
## 32            canada america      1.3        14.8     3.2    2.9      4.8
## 36             chile america      4.4         9.6     4.3    5.1      4.0
## 38          colombia america      6.0         7.2     2.4    5.6      4.0
## 42        costa rica america      3.8        11.3     1.6    5.2      5.7
## 45              cuba america      4.5        14.1     4.2    4.7      4.1
## 50          dominica america      9.9        10.8     3.7    3.8      4.9
## 51     dominican rep america      7.6         6.8     1.6    9.3      3.7
## 52           ecuador america      5.9         6.9     1.7   10.3      5.7
## 54       el salvador america     11.3         3.5     1.5    6.0      3.5
## 68           grenada america      4.6         6.4     7.9    6.5      2.0
## 69         guatemala america      8.9         3.7     1.7   17.7      3.1
## 72            guyana america     11.8         5.6     1.0    4.6      2.0
## 73             haiti america      6.7         7.1     2.3    7.9      1.9
## 74          honduras america     11.1         5.2     2.1   16.1      4.2
## 84           jamaica america     11.8         9.7     3.3    4.4      2.6
## 109           mexico america      5.0         5.3     1.3    6.4      4.1
## 123        nicaragua america     11.7         5.6     1.0   10.0      4.2
## 132           panama america      7.2         9.2     1.8    4.6      4.9
## 133         paraguay america      8.3         8.1     4.1    3.3      5.1
## 134             peru america      9.3         5.8     1.2    8.2      4.5
## 143      saint lucia america      7.3         6.2     2.7    4.0      4.5
## 144    saint vincent america      9.9         6.0     1.2    3.6      3.0
## 162        st. kitts america      1.8        15.1     0.0   10.2      5.2
## 164         suriname america      7.7         7.4     1.8    7.2      3.2
## 175    trinidad/tob. america      8.0        12.2     1.7    2.6      4.0
## 183    united states america      1.1        12.6     3.4    3.9      5.3
## 184          uruguay america      4.0        20.8     7.1    1.8      5.8
## 187        venezuela america      7.9         7.4     1.5    4.1      3.7
##     mama oral ovario pancreas pulmon vejiga gdpcapita      region.1
## 6   29.8  2.7    8.5      3.4    8.3    3.1    12.480     caribbean
## 8   24.8  2.3    2.6      8.8   21.8    3.2        11    suramerica
## 13  27.7  4.1    3.3      1.9    9.7    1.5     6.813     caribbean
## 16  25.4  3.8    2.1      5.0    6.1    0.8       706     caribbean
## 19  12.5  0.2    0.8      3.2   12.7    1.1    47.807     caribbean
## 22   8.4  1.0    2.3      2.9    6.5    1.0     2.374    suramerica
## 25  13.6  4.6    1.8      4.3   14.0    2.0    12.594    suramerica
## 32  20.2  2.3    3.1      6.6   33.7    3.1    50.565  norteamerica
## 36  12.3  1.3    1.9      5.4   14.2    2.3    14.395    suramerica
## 38  11.0  1.7    2.1      3.7   12.9    1.4     7.100    suramerica
## 42  17.6  2.7    1.8      4.2    6.9    1.9     8.676 centroamerica
## 45  18.2  4.5    1.7      5.4   33.8    3.7     6.106     caribbean
## 50  27.0  5.7    0.0      4.5   10.9    2.6     7.322     caribbean
## 51  13.3  4.3    0.7      3.4   12.1    0.6     5.512     caribbean
## 52  11.1  1.6    2.0      4.4    9.5    1.0     4.829    suramerica
## 54   7.0  1.6    1.6      2.9    6.2    0.7     3.702 centroamerica
## 68  23.3  4.3    2.6      7.7   13.2    1.8     7.868     caribbean
## 69   6.2  2.2    0.9      2.9    7.1    0.5     3.178 centroamerica
## 72  18.1  1.9    1.9      3.3    4.8    0.7     3.408    suramerica
## 73  12.1  1.4    1.4      3.8    8.0    1.2       665     caribbean
## 74   8.3  2.4    1.4      3.9    8.9    0.7     2.250 centroamerica
## 84  24.8  2.2    1.6      4.7   16.2    2.9     5.360     caribbean
## 109 11.3  1.2    2.0      4.6    8.6    1.4    10.063 centroamerica
## 123  9.5  1.4    1.7      3.7    6.9    0.7     1.243 centroamerica
## 132 13.0  1.7    1.9      4.4   12.0    1.1     2.112 centroamerica
## 133 19.0  3.3    1.6      4.4   15.3    1.1     3.485    suramerica
## 134 11.8  1.1    1.9      4.0    7.3    1.4     6.138    suramerica
## 143 14.6  5.2    2.7      3.8   10.0    2.6     7.124     caribbean
## 144 18.0  6.0    1.0      4.2    6.9    0.3     6.291     caribbean
## 162 36.1  4.7    1.6      8.7    5.4    3.2    15.154     caribbean
## 164 14.7  1.5    2.7      3.5   11.3    1.4     8.708    suramerica
## 175 22.1  2.4    4.3      5.9    9.6    1.4    16.272     caribbean
## 183 18.8  2.1    3.2      7.4   35.4    3.0    47.882  norteamerica
## 184 29.5  4.5    2.8      8.9   26.8    4.4    13.819    suramerica
## 187 15.3  1.9    2.0      3.8   15.2    1.6    10.731    suramerica
cancer[cancer$region == "america" & cancer$mama >= median(cancer$mama), ]
##                 pais  region cervical colon.recto esofago higado leucemia
## 6   antigua and bar. america      5.4        13.6     4.6    5.2      4.0
## 8          argentina america      5.2        17.1     4.8    4.1      4.4
## 13           bahamas america      4.7        10.8     3.4    3.3      4.1
## 16          barbados america      6.0        19.8     3.8    4.4      4.1
## 32            canada america      1.3        14.8     3.2    2.9      4.8
## 42        costa rica america      3.8        11.3     1.6    5.2      5.7
## 45              cuba america      4.5        14.1     4.2    4.7      4.1
## 50          dominica america      9.9        10.8     3.7    3.8      4.9
## 68           grenada america      4.6         6.4     7.9    6.5      2.0
## 72            guyana america     11.8         5.6     1.0    4.6      2.0
## 84           jamaica america     11.8         9.7     3.3    4.4      2.6
## 133         paraguay america      8.3         8.1     4.1    3.3      5.1
## 144    saint vincent america      9.9         6.0     1.2    3.6      3.0
## 162        st. kitts america      1.8        15.1     0.0   10.2      5.2
## 175    trinidad/tob. america      8.0        12.2     1.7    2.6      4.0
## 183    united states america      1.1        12.6     3.4    3.9      5.3
## 184          uruguay america      4.0        20.8     7.1    1.8      5.8
##     mama oral ovario pancreas pulmon vejiga gdpcapita      region.1
## 6   29.8  2.7    8.5      3.4    8.3    3.1    12.480     caribbean
## 8   24.8  2.3    2.6      8.8   21.8    3.2        11    suramerica
## 13  27.7  4.1    3.3      1.9    9.7    1.5     6.813     caribbean
## 16  25.4  3.8    2.1      5.0    6.1    0.8       706     caribbean
## 32  20.2  2.3    3.1      6.6   33.7    3.1    50.565  norteamerica
## 42  17.6  2.7    1.8      4.2    6.9    1.9     8.676 centroamerica
## 45  18.2  4.5    1.7      5.4   33.8    3.7     6.106     caribbean
## 50  27.0  5.7    0.0      4.5   10.9    2.6     7.322     caribbean
## 68  23.3  4.3    2.6      7.7   13.2    1.8     7.868     caribbean
## 72  18.1  1.9    1.9      3.3    4.8    0.7     3.408    suramerica
## 84  24.8  2.2    1.6      4.7   16.2    2.9     5.360     caribbean
## 133 19.0  3.3    1.6      4.4   15.3    1.1     3.485    suramerica
## 144 18.0  6.0    1.0      4.2    6.9    0.3     6.291     caribbean
## 162 36.1  4.7    1.6      8.7    5.4    3.2    15.154     caribbean
## 175 22.1  2.4    4.3      5.9    9.6    1.4    16.272     caribbean
## 183 18.8  2.1    3.2      7.4   35.4    3.0    47.882  norteamerica
## 184 29.5  4.5    2.8      8.9   26.8    4.4    13.819    suramerica

Los operadores lógicos en R son:

Operador Equivale a
== Igual a
!= Diferente a
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que

No hay comentarios: