7.4: Extracción de un subconjunto de un vector
- Page ID
- 151549
\( \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}\)Un tipo muy importante de manejo de datos es poder extraer un subconjunto particular de los datos. Por ejemplo, podría interesarte solo en analizar los datos de una condición experimental, o quizás quieras mirar de cerca los datos de personas mayores de 50 años de edad. Para ello, el primer paso es conseguir que R extraiga el subconjunto de los datos correspondientes a las observaciones que te interesan. En esta sección voy a hablar del subestablecimiento tal como se aplica a los vectores, extendiendo la discusión desde los Capítulos 3 y 4. En la Sección 7.5 voy a hablar sobre cómo esta discusión se extiende a los marcos de datos.
Refresher
Esta sección vuelve al conjunto de datos Nightgarden.rData
. Si estás leyendo todo este capítulo de una sola sesión, entonces ya deberías tener cargado este conjunto de datos. Si no, no olvides usar el comando load (“Nightgarden.rData”)
. Para esta sección, ignoremos el marco de datos itng
que creamos anteriormente, y enfoquemos en su lugar en los dos vectores speaker
y utterance
(vea la Sección 7.1 si ha olvidado cómo son esos vectores). Supongamos que lo que quiero hacer es sacar sólo esas declaraciones que fueron hechas por Makka-Pakka. Para ello, primero podría usar el operador de igualdad para que R me diga qué casos corresponden a Makka-Pakka hablando:
is.MP.speaking <- speaker == "makka-pakka"
is.MP.speaking
## [1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
y luego usar indexación lógica para obtener R para imprimir aquellos elementos de enunciado
para los que es.mp.Speaking
es cierto, así:
utterance[ is.MP.speaking ]
## [1] "pip" "pip" "onk" "onk"
O, como soy perezoso, podría colapsarla a un solo comando así:
utterance[ speaker == "makka-pakka" ]
## [1] "pip" "pip" "onk" "onk"
Usar %in%
coincide con varios casos
Un segundo truco útil a tener en cuenta es el operador %en%
110. En realidad es muy similar al operador ==
, excepto que se puede suministrar una colección de valores aceptables. Por ejemplo, supongamos que quería quedarme solo aquellos casos en los que el enunciado es o bien “pip” o “oo”. Una forma sencilla de hacer esto es:
utterance %in% c("pip","oo")
## [1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE
Qué hace esto si devuelve VERDADERO
para aquellos elementos de enunciado
que son o bien “pip”
o “oo”
y devuelve FALSO
para todos los demás. Lo que eso significa es que si quiero una lista de todas esas instancias de personajes que hablan cualquiera de estas dos palabras, podría hacer esto:
speaker[ utterance %in% c("pip","oo") ]
## [1] "upsy-daisy" "upsy-daisy" "tombliboo" "makka-pakka" "makka-pakka"
Usar índices negativos para soltar elementos
Antes de pasar a los marcos de datos, hay un par de trucos que vale la pena mencionar. El primero de ellos es utilizar valores negativos como índices. Recordemos de la Sección 3.10 que podemos usar un vector de números para extraer un conjunto de elementos que nos gustaría conservar. Por ejemplo, supongamos que quiero mantener solo los elementos 2 y 3 del enunciado
. Podría hacerlo así:
utterance[2:3]
## [1] "pip" "onk"
Pero supongamos, por otro lado, que he descubierto que las observaciones 2 y 3 no son confiables, y quiero conservar todo excepto esos dos elementos. Para ello, R te permite usar números negativos para eliminar valores específicos, así:
utterance [ -(2:3) ]
## [1] "pip" "onk" "ee" "oo" "pip" "pip" "onk" "onk"
La salida aquí corresponde al elemento 1 del vector original, seguido de los elementos 4, 5, y así sucesivamente. Cuando todo lo que quieres hacer es quitar algunos casos, esta es una convención muy práctica.
Dividir un vector por grupo
Un ejemplo particular de subestablecimiento que es especialmente común es el problema de dividir una variable en varias variables diferentes, una correspondiente a cada grupo. Por ejemplo, en nuestro ejemplo En el jardín nocturno, podría querer crear subconjuntos de la variable de enunciación
para cada carácter. Una forma de hacer esto sería simplemente repetir el ejercicio que pasé antes por separado para cada personaje, pero eso rápidamente se vuelve molesto. Una forma más rápida de hacerlo es usar la función split ()
. Los argumentos son:
x
. La variable que necesita ser dividida en grupos.f
. La variable de agrupación.
Lo que hace esta función es generar una lista (Sección 4.9), que contiene una variable por cada grupo. Por ejemplo, podría dividir la variable de enunciación
por altavoz
usando el siguiente comando:
speech.by.char <- split( x = utterance, f = speaker )
speech.by.char
## $`makka-pakka`
## [1] "pip" "pip" "onk" "onk"
##
## $tombliboo
## [1] "ee" "oo"
##
## $`upsy-daisy`
## [1] "pip" "pip" "onk" "onk"
Una vez que comienzas a sentirte cómodo trabajando con listas y marcos de datos, esta salida es todo lo que necesitas, ya que puedes trabajar con esta lista de la misma manera que trabajarías con un marco de datos. Por ejemplo, si quieres la primera enunciación hecha por Makka-Pakka, todo lo que necesitas hacer es escribir esto:
speech.by.char$`makka-pakka`[1]
## [1] "pip"
Solo recuerda que R sí necesita que agregue los caracteres de comillas (es decir, '
). De lo contrario, aquí no hay nada particularmente nuevo o difícil.
Sin embargo, a veces, especialmente cuando recién estás comenzando, puede ser conveniente sacar estas variables de la lista y meterlas en el espacio de trabajo. Esto no es demasiado difícil de hacer, aunque puede ser un poco desalentador para los principiantes. Para ello, he incluido una función llamada ImportList ()
en el paquete lsr
que hace esto. 111 Primero, esto es lo que tendrías si hubieras borrado el espacio de trabajo antes del inicio de esta sección:
who()
## -- Name -- -- Class -- -- Size --
## age numeric 11
## age.breaks numeric 4
## age.group factor 11
## age.group2 factor 11
## age.group3 factor 11
## age.labels character 3
## df data.frame 10 x 4
## is.MP.speaking logical 10
## itng data.frame 10 x 2
## itng.table table 3 x 4
## likert.centred numeric 10
## likert.raw numeric 10
## opinion.dir numeric 10
## opinion.strength numeric 10
## some.data numeric 18
## speaker character 10
## speech.by.char list 3
## utterance character 10
Ahora usamos la función importList ()
para copiar todas las variables dentro de la lista speech.by.char
:
importList( speech.by.char, ask = FALSE)
Debido a que la función importList ()
está intentando crear nuevas variables basadas en los nombres de los elementos de la lista, hace una pausa para verificar que estás de acuerdo con los nombres de las variables. La razón por la que hace esto es que, si una de las variables a crear tiene el mismo nombre que una variable que ya tienes en tu espacio de trabajo, esa variable terminará siendo sobrescrita, así que es una buena idea verificar. Suponiendo que escribes y
, pasará a crear las variables. Parece que no ha pasado nada, pero si miramos ahora nuestro espacio de trabajo:
who()
## -- Name -- -- Class -- -- Size --
## age numeric 11
## age.breaks numeric 4
## age.group factor 11
## age.group2 factor 11
## age.group3 factor 11
## age.labels character 3
## df data.frame 10 x 4
## is.MP.speaking logical 10
## itng data.frame 10 x 2
## itng.table table 3 x 4
## likert.centred numeric 10
## likert.raw numeric 10
## makka.pakka character 4
## opinion.dir numeric 10
## opinion.strength numeric 10
## some.data numeric 18
## speaker character 10
## speech.by.char list 3
## tombliboo character 2
## upsy.daisy character 4
## utterance character 10
vemos que hay tres nuevas variables, llamadas makka.pakka
, tombliboo
y upsy.daisy
. Observe que la función importList ()
ha convertido las cadenas de caracteres originales en nombres de variables R válidos, por lo que la variable correspondiente a “makka-pakka”
es en realidad makka.pakka
. 112 Sin embargo, aunque los nombres puedan cambiar, tenga en cuenta que cada una de estas variables contiene exactamente la misma información que los elementos originales de la lista. Por ejemplo:
> makka.pakka
[1] "pip" "pip" "onk" "onk"