4.8: Marcos de datos
- Page ID
- 151504
\( \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}\)Ahora es el momento de volver atrás y lidiar con lo algo confuso que pasó en la Sección?? cuando intentamos abrir un archivo CSV. Al parecer logramos cargar los datos, pero nos llegó en un formato de aspecto muy extraño. En su momento, le dije que esto era un marco de datos. Ahora mejor explicaré lo que eso significa.
Introducción de marcos de datos
Para entender por qué R ha creado esta cosa graciosa llamada marco de datos, ayuda a tratar de ver qué problema resuelve. Entonces volvamos al pequeño escenario que usé al introducir factores en la Sección 4.7. En esa sección registré el grupo
y género
para los 9 participantes de mi estudio. Supongamos también que grabé sus edades y su partitura
en “Dan's Terribly Exciting Psychological Test”:
age <- c(17, 19, 21, 37, 18, 19, 47, 18, 19)
score <- c(12, 10, 11, 15, 16, 14, 25, 21, 29)
Suponiendo que no hay otras variables en el espacio de trabajo, si tecleo who ()
obtengo esto:
who()
## -- Name -- -- Class -- -- Size --
## age numeric 9
## gender factor 9
## group factor 9
## score numeric 9
Por lo que hay cuatro variables en el espacio de trabajo, edad
, género
, grupo
y puntaje
. Y da la casualidad de que los cuatro son del mismo tamaño (es decir, todos son vectores con 9 elementos). Aaay da la casualidad de que la edad [1]
corresponde a la edad de la primera persona, y el género [1]
es el género de esa misma persona, etc. En otras palabras, usted y yo sabemos que las cuatro variables corresponden al mismo conjunto de datos, y las cuatro de se organizan exactamente de la misma manera.
Sin embargo, ¡R no lo sabe! En lo que a él respecta, no hay razón por la que la variable edad
tenga que ser la misma longitud que la variable género
; y no hay razón particular para pensar que la edad [1]
tiene alguna relación especial con el género [1]
más de lo que tiene una relación especial con género [4]
. Es decir, cuando almacenamos todo en variables separadas como esta, R no sabe nada sobre las relaciones entre las cosas. Ni siquiera sabe realmente que estas variables realmente se refieren a un conjunto de datos adecuado. El marco de datos corrige esto: si almacenamos nuestras variables dentro de un marco de datos, le estamos diciendo a R que trate estas variables como un conjunto de datos único y bastante coherente.
Para ver cómo hacen esto, vamos a crear uno. Entonces, ¿cómo creamos un marco de datos? Una forma que ya hemos visto: si importamos nuestros datos desde un archivo CSV, R los almacenará como un marco de datos. Una segunda forma es crearla directamente a partir de algunas variables existentes usando la función data.frame ()
. Todo lo que tienes que hacer es escribir una lista de variables que quieres incluir en el marco de datos. La salida de un comando data.frame ()
es, bueno, un marco de datos. Entonces, si quiero almacenar las cuatro variables de mi experimento en un marco de datos llamado expt
puedo hacerlo así:
expt <- data.frame ( age, gender, group, score )
expt
## age gender group score
## 1 17 male group 1 12
## 2 19 male group 1 10
## 3 21 male group 1 11
## 4 37 male group 2 15
## 5 18 male group 2 16
## 6 19 female group 2 14
## 7 47 female group 3 25
## 8 18 female group 3 21
## 9 19 female group 3 29
Tenga en cuenta que expt
es una variable completamente autónoma. Una vez que lo hayas creado, ya no depende de las variables originales a partir de las cuales se construyó. Es decir, si hacemos cambios a la variable de edad
original, no conducirá a ningún cambio en los datos de edad almacenados en expt
.
En este punto, nuestro espacio de trabajo contiene solo una variable, un marco de datos llamado expt
. Pero como podemos ver cuando le dijimos a R que imprimiera la variable, este marco de datos contiene 4 variables, cada una de las cuales tiene 9 observaciones. Entonces, ¿cómo sacamos de nuevo esta información? Después de todo, no tiene sentido almacenar información si no la usas, y no hay forma de usar la información si no puedes acceder a ella. Entonces, hablemos un poco sobre cómo sacar información de un marco de datos.
Lo primero que podríamos querer hacer es sacar una de nuestras variables almacenadas, digamos score
. Una cosa que podrías intentar hacer es ignorar el hecho de que la puntuación
está bloqueada dentro del marco de datos expt
. Por ejemplo, podrías intentar imprimirlo así:
score
## Error in eval(expr, envir, enclos): object 'score' not found
Esto no funciona, porque R no va a “echar un vistazo” dentro del marco de datos a menos que le digas explícitamente que lo haga. En realidad hay una muy buena razón para esto, que voy a explicar en un momento, pero por ahora solo supongamos que R sabe lo que está haciendo. ¿Cómo le decimos a R que mire dentro del marco de datos? Como siempre es el caso con R hay varias formas. La forma más sencilla es usar el operador $
para extraer la variable que te interesa, así:
expt$score
## [1] 12 10 11 15 16 14 25 21 29
Obtener información sobre un marco de datos
Un problema que a veces surge en la práctica es que te olvidas de lo que llamaste a todas tus variables. Normalmente podrías intentar escribir objects ()
o who ()
, ¡pero ninguno de esos comandos te dirá cuáles son los nombres para esas variables dentro de un marco de datos! Una forma es pedirle a R que te diga cuáles son los nombres de todas las variables almacenadas en el marco de datos, lo que puedes hacer usando la función names ()
:
names(expt)
## [1] "age" "gender" "group" "score"
Un método alternativo es usar la función who ()
, siempre y cuando le digas que mire las variables dentro de los marcos de datos. Si estableces expand = TRUE
entonces no solo listará las variables en el espacio de trabajo, sino que “expandirá” cualquier marco de datos que tengas en el espacio de trabajo, para que puedas ver cómo se ven. Es decir:
who(expand = TRUE)
## -- Name -- -- Class -- -- Size --
## expt data.frame 9 x 4
## $age numeric 9
## $gender factor 9
## $group factor 9
## $score numeric 9
o, dado que expand
es el primer argumento en la función who ()
solo puedes escribir who (TRUE)
. Eso voy a hacer mucho en este libro.
¿Buscas más sobre marcos de datos?
Hay mucho más que se puede decir sobre los marcos de datos: son bestias bastante complicadas, y cuanto más tiempo uses R, más importante es asegurarte de que realmente las entiendes. Hablaremos mucho más de ellos en el Capítulo 7.