Tablas bidimensionales

Constituyen el ejemplo más típico de lo que entendemos por tablas de contingencia o ``de referencias cruzadas'' (en terminología de bases de datos). En el caso anterior, en el que estábamos interesados en el estudio de la variable número de insuficientes, una tabla bidimensional podría ser la que proporcionara el reparto de la variable en los diferentes años incluidos en el data.frame. Para conseguir esa tabla podríamos teclear
table(Año,IN)
resultando

 		IN		 		 		 		 		 		 		 		 		 		 

Año 0 1 2 3 4 5 6 7 8 9 10
1994 27 11 2 3 3 1 5 4 9 5 0
1995 69 20 21 4 14 6 7 6 4 8 4
1996 104 37 26 24 7 7 10 6 5 6 4
1997 110 64 29 19 10 4 11 7 6 4 21
1998 415 160 117 87 88 60 61 53 31 14 16
1999 383 149 129 94 69 78 81 39 30 37 18
2000 323 144 101 95 78 91 79 69 49 20 17
2001 213 118 85 84 60 74 63 41 38 19 13

En las tablas de contingencia aparecen con frecuencia una columna y una fila con los valores totales por filas y columnas. En R no hay ninguna función que genere directamente tal tipo de tabla, pero resulta bastante sencillo generarla a partir de la tabla obtenida anteriormente. Los pasos serían los siguientes:
(1) tabla.normal<-table(Año,IN)
(2) total.filas<-apply(tabla.normal,1,sum)
(3) tabla.intermedia<-cbind(tabla.normal,total.filas)
(4) total.columnas<-apply(tabla.intermedia,2,sum)
(5) tabla.final<-rbind(tabla.intermedia,total.columnas)
En la primera instrucción se crea la tabla original y se asigna a un objeto que llamamos tabla.normal.
En la segunda, calculamos el total por filas con la función apply() (no confundir con tapply()). A apply() debemos indicarle varias cosas. En primer lugar, el objeto sobre el que aplicar la función (en este caso tabla.normal); en segundo, que se aplica por filas 1; y, finalmente, la acción que queremos aplicar (en este caso, calcular la suma, sum). El resultado de la función lo asignamos al objeto que llamamos total.filas.
En la tercera instrucción incorporamos a la tabla inicial, mediante la función cbind(), la columna de totales calculada en el paso anterior. Asignamos el nuevo objeto a una tabla llamada tabla.intermedia que no nos interesará una vez terminado el proceso.
En la cuarta, calculamos el total por columnas de la tabla intermedia, que contiene ya el total por filas. Lo hacemos con la función apply(), pero en este caso, como el cálculo se efectúa por columnas y no por filas, en lugar de poner como argumento el número 1, ponemos el 2. También, asignamos el resultado al objeto que llamamos total.columnas.
En el último paso, incorporamos el total por columnas a la tabla intermedia con cbind() para obtener la tabla.final .
El resultado sería:
tabla.final


 		0		1		2		3		4		5		6		  7 		8		9		 10		total.filas

1994 27 11 2 3 3 1 5 4 9 5 0 70
1995 69 20 21 4 14 6 7 6 4 8 4 163
1996 104 37 26 24 7 7 10 6 5 6 4 263
1997 110 64 29 19 10 4 11 7 6 4 21 285
1998 415 160 117 87 88 60 61 53 31 14 16 1102
1999 383 149 129 94 69 78 81 39 30 37 18 1107
2000 323 144 101 95 78 91 79 69 49 20 17 1066
2001 213 118 85 84 60 74 63 41 38 19 13 808
total.columnas 1644 703 510 410 329 321 317 225 172 113 93 4837
Por supuesto, sería posible realizar la acción con una sola instrucción que reuniera las anteriores, pero la creación de macroinstrucciones debería reservarse a los casos en los que se tenga gran control de sus resultados.

Como este tipo de tablas es muy habitual, podría ser conveniente crear una función que la generase con sólo indicar qué variables queremos tabular. Un ejemplo de función que llevaría a cabo ese cometido sería la siguiente.
crea.tabla<-function(x){
+TF<-margin.table(x,1)
+ TC<-margin.table(x,2)
rbind(cbind(x,TotalFilas=TF),TotalColumnas=c(TC,sum(TC)))
}
Como puede apreciarse, en este caso hemos utilizado la función margin(), que calcula directamente la suma por filas o columnas de manera similar a como lo hace apply().
La función se guardaría en el espacio de trabajo con el nombre crea.tabla. Ahora sólo habría que teclear
crea.tabla(table(IN,Año))
para obtener la tabla anterior.
Del mismo modo,
crea.tabla(table(Evaluacion,IN))
generaría una tabla de contingencia de las variables Evaluación e IN con totales de filas y columnas.

Siempre que guardemos los objetos en el espacio de trabajo en el momento de abandonar R, dispondremos de la función crea.tabla() al abrir de nuevo ese espacio de trabajo.
Sin embargo, la función no estaría disponible al abrir cualquier otro espacio de trabajo. Para que sí lo estuviera, podemos introducir la función en el paquete base tal y como se explicó en el apartado Medidas características.

2007-02-12