Saltar al contenido principal

# 7.1: Tabulación y tabulación cruzada de datos

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\id}{\mathrm{id}}$$ $$\newcommand{\Span}{\mathrm{span}}$$

( \newcommand{\kernel}{\mathrm{null}\,}\) $$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$ $$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$ $$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\id}{\mathrm{id}}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\kernel}{\mathrm{null}\,}$$

$$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$

$$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$

$$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$ $$\newcommand{\AA}{\unicode[.8,0]{x212B}}$$

$$\newcommand{\vectorA}[1]{\vec{#1}} % arrow$$

$$\newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow$$

$$\newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vectorC}[1]{\textbf{#1}}$$

$$\newcommand{\vectorD}[1]{\overrightarrow{#1}}$$

$$\newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}}$$

$$\newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}}$$

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\avec}{\mathbf a}$$ $$\newcommand{\bvec}{\mathbf b}$$ $$\newcommand{\cvec}{\mathbf c}$$ $$\newcommand{\dvec}{\mathbf d}$$ $$\newcommand{\dtil}{\widetilde{\mathbf d}}$$ $$\newcommand{\evec}{\mathbf e}$$ $$\newcommand{\fvec}{\mathbf f}$$ $$\newcommand{\nvec}{\mathbf n}$$ $$\newcommand{\pvec}{\mathbf p}$$ $$\newcommand{\qvec}{\mathbf q}$$ $$\newcommand{\svec}{\mathbf s}$$ $$\newcommand{\tvec}{\mathbf t}$$ $$\newcommand{\uvec}{\mathbf u}$$ $$\newcommand{\vvec}{\mathbf v}$$ $$\newcommand{\wvec}{\mathbf w}$$ $$\newcommand{\xvec}{\mathbf x}$$ $$\newcommand{\yvec}{\mathbf y}$$ $$\newcommand{\zvec}{\mathbf z}$$ $$\newcommand{\rvec}{\mathbf r}$$ $$\newcommand{\mvec}{\mathbf m}$$ $$\newcommand{\zerovec}{\mathbf 0}$$ $$\newcommand{\onevec}{\mathbf 1}$$ $$\newcommand{\real}{\mathbb R}$$ $$\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}$$ $$\newcommand{\laspan}[1]{\text{Span}\{#1\}}$$ $$\newcommand{\bcal}{\cal B}$$ $$\newcommand{\ccal}{\cal C}$$ $$\newcommand{\scal}{\cal S}$$ $$\newcommand{\wcal}{\cal W}$$ $$\newcommand{\ecal}{\cal E}$$ $$\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}$$ $$\newcommand{\gray}[1]{\color{gray}{#1}}$$ $$\newcommand{\lgray}[1]{\color{lightgray}{#1}}$$ $$\newcommand{\rank}{\operatorname{rank}}$$ $$\newcommand{\row}{\text{Row}}$$ $$\newcommand{\col}{\text{Col}}$$ $$\renewcommand{\row}{\text{Row}}$$ $$\newcommand{\nul}{\text{Nul}}$$ $$\newcommand{\var}{\text{Var}}$$ $$\newcommand{\corr}{\text{corr}}$$ $$\newcommand{\len}[1]{\left|#1\right|}$$ $$\newcommand{\bbar}{\overline{\bvec}}$$ $$\newcommand{\bhat}{\widehat{\bvec}}$$ $$\newcommand{\bperp}{\bvec^\perp}$$ $$\newcommand{\xhat}{\widehat{\xvec}}$$ $$\newcommand{\vhat}{\widehat{\vvec}}$$ $$\newcommand{\uhat}{\widehat{\uvec}}$$ $$\newcommand{\what}{\widehat{\wvec}}$$ $$\newcommand{\Sighat}{\widehat{\Sigma}}$$ $$\newcommand{\lt}{<}$$ $$\newcommand{\gt}{>}$$ $$\newcommand{\amp}{&}$$ $$\definecolor{fillinmathshade}{gray}{0.9}$$

Una tarea muy común a la hora de analizar datos es la construcción de tablas de frecuencias, o tabulación cruzada de una variable contra otra. Existen varias funciones que puedes usar en R para ese propósito. En esta sección voy a ilustrar el uso de tres funciones — table (), xtabs () y tabulate () — aunque hay otras opciones (por ejemplo, ftable ()) disponibles.

## Crear tablas a partir de vectores

Empecemos con un ejemplo sencillo. Como padre de un niño pequeño, naturalmente paso mucho tiempo viendo programas de televisión como En el jardín nocturno. En el archivo Nightgarden.rdata, he transcrito una breve sección del diálogo. El archivo contiene dos variables, orador y enunciación, y cuando echamos un vistazo a los datos, queda muy claro qué pasó con mi cordura.

library(lsr)
who()
##    -- Name --   -- Class --   -- Size --
##    speaker      character     10
##    utterance    character     10
print( speaker )

##  [1] "upsy-daisy"  "upsy-daisy"  "upsy-daisy"  "upsy-daisy"  "tombliboo"
##  [6] "tombliboo"   "makka-pakka" "makka-pakka" "makka-pakka" "makka-pakka"
print( utterance )
##  [1] "pip" "pip" "onk" "onk" "ee"  "oo"  "pip" "pip" "onk" "onk"

Con estos como mis datos, una tarea que podría encontrarme necesitando hacer es construir un recuento de frecuencia del número de palabras que cada personaje habla durante el espectáculo. La función table () proporciona una manera sencilla de hacer esto. El uso básico de la función table () es el siguiente:

table(speaker)
## speaker
## makka-pakka   tombliboo  upsy-daisy
##           4           2           4

El resultado aquí nos dice en la primera línea que lo que estamos viendo es una tabulación de la variable hablante. En la segunda línea se enumeran todos los diferentes altavoces que existen en los datos, y en la tercera línea te indica cuántas veces aparece ese orador en los datos. Es decir, es una tabla de frecuencias 104 Observe que en el comando anterior no nombré el argumento, ya que table () es otra función que hace uso de argumentos sin nombre. Solo tienes que escribir una lista de las variables que quieres que R tabule, y ésta las tabula. Por ejemplo, si tecleo el nombre de dos variables, lo que obtengo como salida es una tabulación cruzada:

table(speaker, utterance)
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2

Al interpretar esta tabla, recuerde que estos son recuentos: así que el hecho de que la primera fila y la segunda columna correspondan a un valor de 2 indica que Makka-Pakka (fila 1) dice “onk” (columna 2) dos veces en este conjunto de datos. Como era de esperar, puede producir tabulaciones cruzadas de tres vías o de orden superior simplemente agregando más objetos a la lista de entradas. No obstante, no voy a discutir eso en esta sección.

## Crear tablas a partir de marcos de datos

La mayoría de las veces sus datos se almacenan en un marco de datos, no se guardan como variables separadas en el espacio de trabajo. Vamos a crear uno:

itng <- data.frame( speaker, utterance )
itng
##        speaker utterance
## 1   upsy-daisy       pip
## 2   upsy-daisy       pip
## 3   upsy-daisy       onk
## 4   upsy-daisy       onk
## 5    tombliboo        ee
## 6    tombliboo        oo
## 7  makka-pakka       pip
## 8  makka-pakka       pip
## 9  makka-pakka       onk
## 10 makka-pakka       onk

Hay un par de opciones en estas circunstancias. En primer lugar, si solo quieres tabular de forma cruzada todas las variables en el marco de datos, entonces es realmente fácil:

table(itng)

##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2

Sin embargo, a menudo es el caso de que desee seleccionar variables particulares del marco de datos para tabular. Aquí es donde la función xtabs () es útil. En esta función, ingresa una fórmula unilateral para enumerar todas las variables que desea tabular cruzada, y el nombre del marco de datos que almacena los datos:

xtabs( formula = ~ speaker + utterance, data = itng )
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2

Claramente, este es un comando totalmente innecesario en el contexto del marco de datos itng, pero en la mayoría de las situaciones cuando estás analizando datos reales esto es realmente extremadamente útil, ya que es casi seguro que tu conjunto de datos contendrá muchas variables y solo querrás tabular algunas de ellas a la vez .

## Convertir una tabla de recuentos en una tabla de proporciones

Los comandos de tabulación discutidos hasta ahora construyen una tabla de frecuencias sin procesar: es decir, un recuento del número total de casos que satisfacen ciertas condiciones. Sin embargo, muchas veces quieres que tus datos estén organizados en términos de proporciones en lugar de recuentos. Aquí es donde la función prop.table () es útil. Tiene dos argumentos:

• x. La tabla de frecuencias que desea convertir.
• margen. Para qué “dimensión” quieres calcular proporciones. Por defecto, R asume que desea que la proporción se exprese como una fracción de todos los eventos posibles. Ver ejemplos para más detalles.

Para ver cómo funciona esto:

itng.table <- table(itng)  # create the table, and assign it to a variable
itng.table                   # display the table again, as a reminder
##              utterance
## speaker       ee onk oo pip
##   makka-pakka  0   2  0   2
##   tombliboo    1   0  1   0
##   upsy-daisy   0   2  0   2 
prop.table( x = itng.table ) # express as proportion:
##              utterance
## speaker        ee onk  oo pip
##   makka-pakka 0.0 0.2 0.0 0.2
##   tombliboo   0.1 0.0 0.1 0.0
##   upsy-daisy  0.0 0.2 0.0 0.2

Observe que hubo 10 observaciones en nuestro conjunto de datos original, por lo que todo lo que R ha hecho aquí es dividir todas nuestras frecuencias en bruto por 10. Eso es un valor por defecto sensible, pero más a menudo en realidad quieres calcular las proporciones por separado por fila (margin = 1) o por columna (margin = 2). Nuevamente, esto se ve más claramente al mirar ejemplos:

prop.table( x = itng.table, margin = 1)
##              utterance
## speaker        ee onk  oo pip
##   makka-pakka 0.0 0.5 0.0 0.5
##   tombliboo   0.5 0.0 0.5 0.0
##   upsy-daisy  0.0 0.5 0.0 0.5

Observe que cada fila ahora suma a 1, pero eso no es cierto para cada columna. Lo que estamos viendo aquí son las proporciones de enunciados hechos por cada personaje. En otras palabras, el 50% de las declaraciones de Makka-Pakka son “pip”, y el otro 50% son “onk”. Contrastemos esto con el siguiente comando:

prop.table( x = itng.table, margin = 2)
##              utterance
## speaker        ee onk  oo pip
##   makka-pakka 0.0 0.5 0.0 0.5
##   tombliboo   1.0 0.0 1.0 0.0
##   upsy-daisy  0.0 0.5 0.0 0.5

Ahora todas las columnas suman a 1 pero las filas no lo hacen.En esta versión, lo que estamos viendo es la proporción de caracteres asociados a cada enunciado. Por ejemplo, cada vez que se hace la enunciación “ee” (en este conjunto de datos), el 100% de las veces es un Tombliboo diciéndolo.

## tabulación de nivel

Una función final que quiero mencionar es la función tabulate (), ya que esta es en realidad la función de bajo nivel que hace la mayor parte del trabajo duro. Toma un vector numérico como entrada, y las frecuencias de salida como salidas:

some.data <- c(1,2,3,1,1,3,1,1,2,8,3,1,2,4,2,3,5,2)
tabulate(some.data)
## [1] 6 5 4 1 1 0 0 1

This page titled 7.1: Tabulación y tabulación cruzada de datos is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform.