Saltar al contenido principal
LibreTexts Español

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}}\)

    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" 

    This page titled 7.4: Extracción de un subconjunto de un vector is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.