3.7: Almacenar muchos números como vector
- Page ID
- 151396
\( \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}\)En este punto hemos cubierto funciones con suficiente detalle para que podamos pasar de manera segura a través de los siguientes capítulos (con una pequeña excepción: ver Sección 4.11, así que volvamos a nuestra discusión sobre las variables. Cuando introduje variables en la Sección3.4 te mostré cómo podemos usar variables para almacenar un solo número. En esta sección, ampliaremos esta idea y veremos cómo almacenar varios números dentro de una variable. En R, el nombre de una variable que puede almacenar múltiples valores es un vector. Así que vamos a crear uno.
Crear un vector
Vamos a ceñirme a mi tonto ejemplo de “hacerse rico rápido escribiendo libros de texto”. Supongamos que la compañía de libros de texto (si realmente tuviera uno, es decir) me envía datos de ventas mensualmente. Desde que mi clase comienza a fines de febrero, podríamos esperar que la mayoría de las ventas se produzcan hacia el inicio del año. Supongamos que tengo 100 ventas en febrero, 200 ventas en marzo y 50 ventas en abril, y ninguna otra venta para el resto del año. Lo que me gustaría hacer es tener una variable —llamémoslo ventas.por.mes
— que almacene todos estos datos de ventas. El primer número almacenado debe ser 0
ya que no tuve ventas en enero, el segundo debería ser 100
, y así sucesivamente. La forma más sencilla de hacer esto en R es usar la función combine, c ()
. Para ello, todo lo que tenemos que hacer es escribir todos los números que quieras almacenar en una lista separada por comas, así: 35
sales.by.month <c(0, 100, 200, 50, 0, 0, 0, 0, 0, 0, 0, 0)
sales.by.month
## [1] 0 100 200 50 0 0 0 0 0 0 0 0
Para usar la terminología correcta aquí, tenemos una sola variable aquí llamada sales.by.month
: esta variable es un vector que consta de 12 elementos.
digresión práctica
Ahora que hemos aprendido a poner información en un vector, lo siguiente que debemos entender es cómo sacar esa información de nuevo. No obstante, antes de hacerlo merece la pena tomar un ligero desvío. Si has estado siguiendo, escribiendo todos los comandos en R tú mismo, es posible que la salida que viste cuando imprimimos el vector sales.by.month
fuera ligeramente diferente a la que mostré anteriormente. Esto hubiera ocurrido si la ventana (o el panel RStudio) que contiene la consola R es realmente, muy estrecha. Si ese fuera el caso, es posible que haya visto una salida que se parece a esto:
sales.by.month
## [1] 0 100 200 50 0 0 0 0 0 0 0 0
Debido a que no había mucho espacio en la pantalla, R ha impreso los resultados en dos líneas. Pero eso no es lo importante a notar. El punto importante es que la primera línea tiene un [1]
delante de ella, mientras que la segunda línea comienza con [9]
. Está bastante claro lo que está pasando aquí. Para la primera fila, R ha impreso el primer elemento hasta el octavo elemento, por lo que inicia esa fila con un [1]
. Para la segunda fila, R ha impreso el noveno elemento del vector hasta la duodécima, y así comienza esa fila con un [9]
para que puedas saber dónde está de un vistazo. Puede parecerle un poco extraño que R haga esto, pero de alguna manera es una amabilidad, ¡especialmente cuando se trata de conjuntos de datos más grandes!
Obtener información de vectores
Para volver a la historia principal, consideremos el problema de cómo obtener información de un vector. En este punto, podría tener una sospecha furtiva de que la respuesta tiene algo que ver con las [1]
y [9]
cosas que R ha estado imprimiendo. Y claro que tienes razón. Supongamos que solo quiero sacar los datos de ventas de febrero. Febrero es el segundo mes del año, así que probemos esto:
sales.by.month[2]
## [1] 100
Sí, esas son las ventas de febrero bien. Pero hay un detalle sutil que hay que tener en cuenta aquí: observe que R da salida [1] 100
, no [2] 100
. Esto se debe a que R está siendo extremadamente literal. Cuando escribimos ventas.por.mes [2]
, le pedimos a R que encontrara exactamente una cosa, y esa cosa pasa a ser el segundo elemento de nuestro vector ventas.por.mes
. Entonces, cuando da salida [1] 100
lo que R está diciendo es que el primer número que acabamos de pedir es el 100
. Este comportamiento tiene más sentido cuando te das cuenta de que podemos usar este truco para crear nuevas variables. Por ejemplo, podría crear una variable february.sales
como esta:
february.sales <sales.by.month[2]
february.sales
## [1] 100
Obviamente, la nueva variable february.sales
solo debe tener un elemento y así cuando la imprima esta nueva variable, la salida R comienza con un [1]
porque 100
es el valor del primer (y único) elemento de february.sales
. El hecho de que esto también pase a ser el valor del segundo elemento de ventas.por.mes
es irrelevante. En breve volveremos a recoger este tema (Sección3.10.
Alterar los elementos de un vector
A veces querrás cambiar los valores almacenados en un vector. Imagina mi sorpresa cuando el editor me llama para decirme que los datos de ventas de May están equivocados. En realidad había 25 libros adicionales vendidos en mayo, pero hubo un error o algo así que no me lo habían dicho. ¿Cómo puedo arreglar mi variable sales.by.month
? Una posibilidad sería asignar el vector completo nuevamente desde el principio, usando c ()
. Pero eso es mucho mecanografiar. Además, es un poco derrochador: ¿por qué debería R tener que redefinir las cifras de ventas para los 12 meses, cuando solo el 5to está equivocado? Afortunadamente, podemos decirle a R que cambie solo el 5to elemento, usando este truco:
sales.by.month[5] <25
sales.by.month
## [1] 0 100 200 50 25 0 0 0 0 0 0 0
Otra forma de editar variables es usar las funciones edit ()
o fix ()
. No voy a discutirlos a detalle en este momento, pero puedes comprobarlos por tu cuenta.
Cosas útiles para saber sobre vectores
Antes de seguir adelante, quiero mencionar un par de cosas más sobre los vectores. En primer lugar, a menudo te encuentras queriendo saber cuántos elementos hay en un vector (generalmente porque te has olvidado). Puedes usar la función length ()
para hacer esto. Es bastante sencillo:
length( x = sales.by.month )
## [1] 12
En segundo lugar, a menudo se quiere alterar todos los elementos de un vector a la vez. Por ejemplo, supongamos que quería averiguar cuánto dinero ganaba en cada mes. Ya que estoy ganando unos emocionantes $7 por libro (no en serio, eso en realidad está bastante cerca de lo que los autores obtienen en los libros de texto muy caros que se espera que compres), lo que quiero hacer es multiplicar cada elemento en el vector ventas.por.mes
por 7
. R lo hace bastante fácil, como muestra el siguiente ejemplo:
sales.by.month * 7
## [1] 0 700 1400 350 175 0 0 0 0 0 0 0
En otras palabras, cuando multiplicas un vector por un solo número, todos los elementos del vector se multiplican. Lo mismo ocurre con la suma, resta, división y toma de poderes. Así que eso está limpio. Por otro lado, supongamos que quería saber cuánto dinero estaba ganando por día, en lugar de por mes. Ya que no todos los meses tienen el mismo número de días, necesito hacer algo ligeramente diferente. En primer lugar, voy a crear dos nuevos vectores:
days.per.month <c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
profit <sales.by.month * 7
Obviamente, la variable profit
es la misma que creamos anteriormente, y la variable days.per.month
es bastante sencilla. Lo que quiero hacer es dividir cada elemento de ganancia
por el elemento correspondiente de days.per.month
. Nuevamente, R hace esto bastante fácil:
profit / days.per.month
## [1] 0.000000 25.000000 45.161290 11.666667 5.645161 0.000000 0.000000
## [8] 0.000000 0.000000 0.000000 0.000000 0.000000
Todavía no me gustan todos esos ceros, pero eso no es lo que importa aquí. Observe que el segundo elemento de la salida es 25, porque R ha dividido el segundo elemento de ganancia
(es decir, 700) por el segundo elemento de días.por.mes
(es decir, 28). Del mismo modo, el tercer elemento de la salida es igual a 1400 dividido por 31, y así sucesivamente. Hablaremos más sobre cálculos que involucran vectores más adelante (y en particular una cosa llamada la “regla del reciclaje”; Sección 7.12.2, pero eso es suficiente detalle por ahora.