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()
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.:
Publicar un comentario