3.10: Vectores de indexación
- Page ID
- 151383
\( \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 última cosa que añadir antes de terminar este capítulo. Hasta el momento, cada vez que he tenido que sacar información de un vector, todo lo que he hecho es escribir algo así como meses [4]
; y cuando hago esto R imprime el cuarto elemento del vector meses
. En esta sección, te voy a mostrar dos trucos adicionales para sacar información del vector.
Extracción de múltiples elementos
Una cosa muy útil que podemos hacer es sacar más de un elemento a la vez. En el ejemplo anterior, solo usamos un solo número (es decir, 2
) para indicar qué elemento queríamos. Alternativamente, podemos usar un vector. Entonces, supongamos que quería los datos de febrero, marzo y abril. Lo que podría hacer es usar el vector c (2,3,4)
para indicar qué elementos quiero sacar R. Es decir, yo escribiría esto:
sales.by.month[ c(2,3,4) ]
## [1] 100 200 50
Observe que el orden importa aquí. Si pedí los datos en el orden inverso (es decir, primero de abril, luego marzo, luego febrero) usando el vector c (4,3,2)
, entonces R emite los datos en el orden inverso:
sales.by.month[ c(4,3,2) ]
## [1] 50 200 100
Una segunda cosa a tener en cuenta es que R te proporciona atajos prácticos para situaciones muy comunes. Por ejemplo, supongamos que quería extraer todo desde el segundo mes hasta el mes 8. Una forma de hacer esto es hacer lo mismo que hice anteriormente, y usar el vector c (2,3,4,5,6,7,8)
para indicar los elementos que quiero. Eso funciona bien
sales.by.month[ c(2,3,4,5,6,7,8) ]
## [1] 100 200 50 25 0 0 0
pero es una especie de mucho mecanografiado. Para ayudar a que esto sea más fácil, R te permite usar 2:8
como taquigrafía para c (2,3,4,5,6,7,8)
, lo que simplifica mucho las cosas. Primero, vamos a comprobar que esto es cierto:
2:8
## [1] 2 3 4 5 6 7 8
A continuación, comprobemos que podemos usar la taquigrafía 2:8
como una forma de sacar los elementos 2 a 8 de ventas.por.meses
:
sales.by.month[2:8]
## [1] 100 200 50 25 0 0 0
Así que eso es un poco ordenado.
Indexación lógica
En este punto, puedo introducir una herramienta sumamente útil llamada indexación lógica. En la última sección, creé un vector lógico any.sales.this.month
, cuyos elementos son VERDADEROS
para cualquier mes en el que vendí al menos un libro, y FALSO
para todos los demás. Sin embargo, esa larga lista grande de TRUE
s y FALSE
s es un poco difícil de leer, así que lo que me gustaría hacer es que R seleccione los nombres de los meses
para los que vendí algún libro. Anteriormente, creé un vector meses
que contiene los nombres de cada uno de los meses. Aquí es donde la indexación lógica es útil. Lo que tengo que hacer es esto:
months[ sales.by.month > 0 ]
## [1] "February" "March" "April" "May"
Para entender lo que está sucediendo aquí, es útil notar que sales.by.month > 0
es la misma expresión lógica que usamos para crear el vector any.sales.this.month
en la última sección. De hecho, podría haber hecho esto:
months[ any.sales.this.month ]
## [1] "February" "March" "April" "May"
y obtuvo exactamente el mismo resultado. Para averiguar qué elementos de meses
incluir en la salida, lo que hace R es mirar para ver si el elemento correspondiente en cualquier.sales.this.month
es VERDADERO
. Así, dado que el elemento 1 de cualquier.ventas.este.mes
es FALSO
, R no incluye “enero”
como parte de la salida; pero dado que el elemento 2 de cualquier.ventas.este.mes
es VERDADERO
, R sí incluye “febrero”
en la salida. Tenga en cuenta que no hay razón por la que no pueda usar el mismo truco para encontrar los números de ventas reales de esos meses. El comando para hacer eso sería simplemente este:
sales.by.month [ sales.by.month > 0 ]
## [1] 100 200 50 25
De hecho, podemos hacer lo mismo con el texto. He aquí un ejemplo. Supongamos que —para continuar con la saga de las ventas de libros de texto— más tarde me entero de que la librería sólo contaba con existencias suficientes durante unos meses del año. Me dicen que a principios de año tenían existencias “altas”
, que luego bajaron a niveles “bajos”
, y de hecho durante un mes estuvieron “fuera”
de copias del libro por un tiempo antes de que pudieran reponerlas. Por lo tanto, podría tener una variable llamada stock.levels
que se ve así:
stock.levels<-c("high", "high", "low", "out", "out", "high",
"high", "high", "high", "high", "high", "high")
stock.levels
## [1] "high" "high" "low" "out" "out" "high" "high" "high" "high" "high"
## [11] "high" "high"
Así, si quiero saber los meses por los que la librería estuvo fuera de mi libro, podría aplicar el truco lógico de indexación, pero con el carácter vector stock.levels
, así:
months[stock.levels == "out"]
## [1] "April" "May"
Alternativamente, si quiero saber cuándo la librería estaba baja en copias o sin copias, podría hacer esto:
months[stock.levels == "out" | stock.levels == "low"]
## [1] "March" "April" "May"
o esto
months[stock.levels != "high" ]
## [1] "March" "April" "May"
De cualquier manera, obtengo la respuesta que quiero.
En este punto, espero que puedan ver por qué la indexación lógica es algo tan útil. Es una forma muy básica, pero muy poderosa de manipular datos. Hablaremos mucho más sobre cómo manipular datos en el Capítulo 7, ya que es una habilidad crítica para la investigación del mundo real que a menudo se pasa por alto en las clases de métodos introductorios de investigación (o al menos, esa ha sido mi experiencia). Se necesita un poco de práctica para sentirse completamente cómodo usando la indexación lógica, por lo que es una buena idea jugar con este tipo de comandos. Intenta crear algunas variables distintas propias, y luego hazte preguntas como “¿cómo consigo que R escupe todos los elementos que son [bla]”? La práctica hace la perfección, y es solo practicando la indexación lógica que perfeccionarás el arte de gritar insultos frustrados a tu computadora. 40