7.13: Resumen
- Page ID
- 151633
\( \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}\)Obviamente, no hay coherencia real en este capítulo. Es solo una bolsa de temas y trucos que puede ser útil conocer, así que el mejor resumen que puedo dar aquí es solo para repetir esta lista:
- Sección 7.1. Tabulando datos.
- Sección 7.2. Transformar o recodificar una variable.
- Sección 7.3. Algunas funciones matemáticas útiles.
- Sección 7.4. Extracción de un subconjunto de un vector.
- Sección 7.5. Extracción de un subconjunto de un marco de datos.
- Sección 7.6. Ordenar, voltear o fusionar conjuntos de datos.
- Sección 7.7. Reformar un marco de datos.
- Sección 7.8. Manipulación de texto.
- Sección 7.9. Apertura de datos de diferentes tipos de archivos.
- Sección 7.10. Coaccionar datos de un tipo a otro.
- Sección 7.11. Otros tipos de datos importantes.
- Sección 7.12. Temas diversos.
Hay una serie de libros por ahí que amplían esta discusión. Un par de mis favoritos son Spector (2008) “Manipulación de datos con R” y Teetor (2011) “R Cookbook”.
Referencias
Spector, P. 2008. Manipulación de Datos con R. Nueva York, NY: Springer.
Teetor, P. 2011. R Libro de cocina. Sebastopol, CA: O'Reilly.
- La cita viene de Home is the Hangman, publicada en 1975.
- Como es habitual, puede asignar esta salida a una variable. Si escribe
speaker.freq <- table (speaker)
en el símbolo del sistema R almacenará la tabla como una variable. Si luego escribesclass (speaker.freq)
verás que la salida es en realidad detabla
de clases. Lo clave a tener en cuenta sobre un objeto table es que básicamente es una matriz (ver Sección 7.11.1. - Vale la pena señalar que también hay una función más potente llamada función
recode ()
en el paquete deautos
que no voy a discutir en este libro pero que vale la pena investigar si buscas un poco más de flexibilidad. - Si has leído más en el libro, y estás releyendo esta sección, entonces un buen ejemplo de esto sería alguien que elija hacer un ANOVA usando
age.group3
como variable de agrupación, en lugar de ejecutar una regresión usandoage
como predictor. A veces hay buenas razones para hacer esto: por ejemplo, si la relación entre laedad
y tu variable de resultado es altamente no lineal, ¡y no te sientes cómodo tratando de ejecutar una regresión no lineal! Sin embargo, a menos que realmente tengas una buena razón para hacer esto, es mejor no hacerlo. Tiende a introducir todo tipo de otros problemas (por ejemplo, los datos probablemente violarán la suposición de normalidad), y se puede perder mucho poder. - La verdadera respuesta es 0: $10 por un sándwich es una ripoff total así que debería ir al lado y comprar fideos.
- De nuevo, dudo que sea la respuesta correcta del “mundo real”. Sospecho que la mayoría de las tiendas de sándwiches no te permitirán pagar tus deudas con ellos en sándwiches. Pero se entiende la idea.
- En realidad, eso es un poco mentira: la función
log ()
es más flexible que eso, y se puede utilizar para calcular logaritmos en cualquier base. La funciónlog ()
tiene un argumentobase
que puede especificar, que tiene un valor predeterminado de e. Asílog10 (1000)
es realmente equivalente alog (x = 1000, base = 10)
. - También vale la pena revisar la función
match ()
- También funciona en marcos de datos si alguna vez siente la necesidad de importar todas sus variables desde el marco de datos al espacio de trabajo. Esto puede ser útil a veces, aunque no es una buena idea si tienes grandes conjuntos de datos o si estás trabajando con varios conjuntos de datos a la vez. En particular, si haces esto, nunca olvides que ahora tienes dos copias de todas tus variables, una en el espacio de trabajo y otra en el marco de datos.
- Puedes hacerlo tú mismo usando la función
make.names ()
. De hecho, esto es en sí mismo algo útil de conocer. Por ejemplo, si quieres convertir los nombres de las variables de la listaspeech.by.char
en nombres de variables R válidos, podrías usar un comando como este:names (speech.by.char) <- make.names (names (speech.by.char))
. Sin embargo, aquí no voy a entrar en detalles. - Convenientemente, si escribe
rownames (df) <- NULL
R renumerará todas las filas desde cero. Para el marco de datosdf
, las etiquetas que actualmente se ejecutan de 7 a 10 serán cambiadas para pasar de 1 a 4. - En realidad, puedes hacer que la función
subset ()
se comporte de esta manera usando el argumentodrop
opcional, pero por defectosubset ()
no drop, lo que probablemente sea más sensato y más intuitivo para los usuarios novatos. - En concreto, la indexación recursiva, una herramienta útil en algunos contextos pero no algo que quiero discutir aquí.
- Recuerde,
print ()
es genérico: ver Sección 4.11. - Nota para usuarios avanzados: ambas funciones son solo envoltorios a la función
matrix ()
, que es bastante flexible en cuanto a la capacidad de convertir vectores en matrices. Además, mientras estoy en este tema, mencionaré brevemente el hecho de que si eres usuario de Matlab y buscas un equivalente de la funciónrepmat ()
de Matlab, te sugiero que revises el paquetematlab
que contiene versiones R de muchas funciones útiles de Matlab. - La función que necesitas para eso se llama
como.data.frame ()
. - En verdad, sospecho que la mayoría de los casos en los que puede voltear sensatamente un marco de datos ocurren cuando todas las variables originales son medidas del mismo tipo (por ejemplo, todas las variables son tiempos de respuesta), y si es así, fácilmente podría haber elegido codificar sus datos como una matriz en lugar de como un marco de datos. Pero como la gente a veces prefiere trabajar con marcos de datos, he escrito la función
tFrame ()
por conveniencia. Realmente no creo que sea algo que se necesita muy a menudo. - Esta limitación es deliberada, por cierto: si estás llegando al punto en el que quieres hacer algo más complicado, probablemente deberías empezar a aprender a usar
reshape ()
,cast ()
ymelt ()
o alguna de las otras herramientas más avanzadas. Las funcionesWideToLong ()
yLongToWide ()
se incluyen solo para ayudarte cuando empiezas a usar R. - Para ser honesto, me molesta un poco que el valor por defecto de
sep
sea un espacio. Normalmente cuando quiero pegar cadenas juntas no quiero ningún carácter separador, así que preferiría que el valor por defecto fuerasep= "”
. Para ello, vale la pena señalar que también hay una funciónpaste0 ()
, que es idéntica apaste ()
excepto que siempre asume quesep= "”
.¿Tipo?
pegar para más información sobre esto. - Ten en cuenta que puedes capturar la salida de
cat ()
si quieres, pero tienes que ser astuto y usar la funcióncapture.output ()
. Por ejemplo, el comandox <- capture.output (cat (hw, ng))
funcionaría bien. - Suspiro. Para usuarios avanzados: R realmente admite dos formas diferentes de especificar expresiones regulares. Uno es el estándar POSIX, el otro es usar expresiones regulares estilo Perl. El valor por defecto es generalmente POSIX. Si entiendes las expresiones regulares, eso probablemente tenía sentido para ti. Si no, no te preocupes. No es importante.
- Agradezco a Amy Perfors por este ejemplo.
- Si tienes suerte.
- También puedes usar el comando
matrix ()
en sí, pero creo que el enfoque “binding” es un poco más intuitivo. - Esto tiene algunas implicaciones interesantes sobre cómo se implementa el álgebra matricial en R (que admito que inicialmente me pareció extraño), pero eso está un poco más allá del alcance de este libro. Sin embargo, dado que habrá una pequeña proporción de lectores a los que les importa, esbozaré rápidamente lo básico a lo que necesita acostumbrarse: al multiplicar una matriz por un vector (o matriz unidimensional) usando el operador
\ %*\%
R intentará interpretar el vector (o matriz 1D) como un vector de fila o columna-vector, dependiendo de lo que haga que funcione la multiplicación. Es decir, supongamos que M es la matriz 2×3, y v es un vector de fila 1×3. Es imposible multiplicar Mv, ya que las dimensiones no se conforman, pero se puede multiplicar por el vector de columna correspondiente, Mvt. Entonces, si configurov <- M [2,]
y luego trato de calcularM\ %*\% v
, que pensarías que fallaría, realmente funciona porque R trata la matriz unidimensional como si fuera un vector de columna para fines de multiplicación matricial. Tenga en cuenta que si ambos objetos son matrices/vectores unidimensionales, esto lleva a la ambigüedad ya que vvt (producto interno) y vtv (producto externo) producen respuestas diferentes. En esta situación, el operador\ %*\%
devuelve el producto interno, no el producto externo. Para entender todos los detalles, consulta la documentación de ayuda. - Debo señalar que si escribes
class (xtab.3d)
descubrirás que este es un objeto“table”
en lugar de un objeto“array”
. Sin embargo, este etiquetado solo es superficial. La estructura de datos subyacente aquí es en realidad una matriz. Los usuarios avanzados pueden querer verificar esto usando laclase de comando (unclass (xtab.3d))
, pero no es importante para nuestros propósitos. Todo lo que realmente quiero hacer en esta sección es mostrarte cómo se ve la salida cuando te encuentras con una matriz 3D. - Los objetos de fecha están codificados como el número de días que han pasado desde el 1 de enero de 1970.
- Para usuarios avanzados: tipo
?
doble para más información. - O al menos, ese es el valor por defecto. Si todos tus números son enteros (números enteros), entonces puedes decirle explícitamente a R que los almacene como enteros agregando un sufijo
L
al final del número. Es decir, una asignación comox <- 2L
le dice a R que asignex
un valor de 2, y que lo almacene como un entero en lugar de como una expansión binaria.¿Tipo?
entero para más detalles. - Para usuarios avanzados: eso es un poco más simplista en dos aspectos. Primero, es una forma terriblemente imprecisa de hablar sobre el alcance. Segundo, podría darte la impresión de que todas las variables en cuestión están realmente cargadas en la memoria. Eso no es del todo cierto, ya que eso sería muy despilfarro de memoria. En cambio, R tiene un mecanismo de “carga perezosa”, en el que lo que R realmente hace es crear una “promesa” para cargar esos objetos si realmente son necesarios. Para obtener más detalles, consulte la función
delayedAssigne ()
.