[MUSIC] En esta lección lo que aprenderemos es a sacar un subconjunto de datos de algún objeto o variable que you tengamos en memoria. Y el cual probablemente sea muy grande como para poder utilizarlo completamente. Generalmente, este tipo de objetos será de la forma de matrices o de listas o de un DataFrame. Hay generalmente tres operadores básicos para hacer una extracción de un subconjunto de datos. Y estos son los corchetes que extraen elementos de la misma clase al objeto que estás extrayendo. Los dobles corchetes que extraen elementos de una lista o un dataframe. Y donde la clase que te va a regresar no necesariamente tiene que ser de tipo lista o dataframe. Y finalmente el sÃmbolo de pesos que extrae elementos de un dataframe. En el ejemplo que estamos viendo en la imagen en pantalla. Podemos ver tres de las maneras que podemos usar corchetes. Una es pidiendo uno de los elementos, por el número del Ãndice que estamos buscando. Una cosa que es importante no olvidar es que los Ãndices en R comienzan desde el número uno, no desde el cero como en otros lenguajes. Luego también podemos pasar una secuencia de números. Y entonces esta secuencia de números, al pedirla por medio de corchetes nos va a regresar los elementos que están en esa secuencia. Y finalmente podemos pasar también un vector lógico. Donde nos va a regresar, al pedirlo por medio de corchetes, los lugares en donde el valor del vector lógico sea igual a verdadero o TRUE. Para hacer un subconjunto de datos de una matriz o lo que es lo mismo un subsetting de matrices. Podemos usar los operadores con corchetes, pero recordemos que la matriz tiene dos dimensiones. Que son los renglones y las columnas. Entonces podemos mandar a llamar utilizando corchetes, el valor de un renglón y una columna en especÃfico, o el valor de una columna entera o de un renglón entero. Ésto lo hacemos, no poniendo ningún elemento en primer lugar en el corchete, luego una coma y luego el valor del renglón o la columna que queremos. Por supuesto también podemos pedir varias columnas poniendo igual secuencias. O incluso también vectores lógicos. Por ejemplo, en la imagen que estamos observando en pantalla, podemos pedir una matriz que you formamos. El elemento 1, 3 es decir, el renglón uno columna tres. Pero por ejemplo, si pedimos el elemento 3, 1 que es al revés, como no tenemos tres renglones, nos va a generar un error. Ésto porque el lÃmite de los Ãndices no está dentro del que nosotros pedimos. Los últimos dos ejemplos lo que estamos viendo es justamente eso. Pedimos el renglón uno y nos da todo el renglón uno. Y en el segundo, pedimos la columna cuatro y nos da exactamente la columna cuatro, que es el siete y el ocho. Una cosa que es importante recordar, es que cuando pedimos un elemento de una matriz. Ésta, este elemento regresado en forma de vector. Es decir, pierde su condición de matriz. Pero si nosotros utilizamos el parámetro Drop = FALSE. Lo que hace R es regresarnos también una matriz. Pedimos igual, el mismo elemento 3, 4 pero el valor que nos está regresando ese subsetting es una matriz que tiene un renglón y una columna, es decir, no ha perdido su condición de matriz. Sólo para reafirmar lo que he dicho, vemos el mismo subsetting. Los valores uno, seis, 11 y 16, de la misma matriz pero usando una el drop=FALSE. Y en el otro el valor por default del parámetro drop que es igual a TRUE. Podemos observar que cuando le pedimos la clase a uno de esos dos subsettings. Lo que estamos observando es que uno es de clase entera y otro es de clase matriz. Ahora, como extraemos elementos de una lista. O hacemos subsetting de listas. Podemos usar tres formas. Una es usando los corchetes, la otra es usar los dobles corchetes y la última es con el sÃmbolo de pesos y el nombre que sólo puede utilizar nombres literales. Cuando hemos nombrado a los elementos de nuestra lista. Como podemos ver aquà en el ejemplo. Si mandamos a llamar, usando sólo corchetes podemos pasar de nuevo una secuencia o valores también lógicos. O como en este caso, muy simple, un número de Ãndice. En este caso estamos pidiendo el Ãndice número uno de la lista. Entonces lo único que nos regresará, es la lista o hola, el elemento de esa lista que es hola. Es decir, los números del uno al diez. Sólo para reafirmar, si pasamos un único Ãndice, un único número a los corchetes nos va regresar el elemento con ese Ãndice y su valor. Ésto en forma de lista, es lo que estamos observando en pantalla. Cuando usamos los dobles corchetes que es por ejemplo en el siguientes, que es x[[1]]. Nos regresa el primer elemento porque es el Ãndice uno, de la lista que es ese vector. Ahora pueden observar que ese vector tiene de forma su clase, es vector. Y finalmente podemos observar también que si inferimos con el sÃmbolo de pesos y el nombre de la variable literal, nos regresa exactamente el mismo valor. Ahora que pasa cunado utilizamos los dobles corchetes con el nombre literal. También nos puede dar ese valor y nos lo regresa en forma de vector. Y finalmente si pedimos la variable literal solamente con un corchete, nos va regresar ese elemento que pedimos, nombrado como hola2 en este caso, pero si se dan cuenta podemos observar que ahora es de tipo lista también. Por ejemplo podemos notar que en la anotación que estamos observando en pantalla, utilizando el operador corchete, podemos pasar un vector, este vector en este ejemplo, tiene los elementos uno y tres. Si se lo pasamos al operador corchetes, nos va a extraer el elemento uno y el tres de nuestra lista X. Que en este caso es dos, tres, cuatro, cinco, hasta el siete y la palabra puente. Ahora observemos que pasa con el operador de doble corchete. El operador doble corchete, uno podrÃa pensar que es similar al operador del signo de pesos. Pero en realidad, en el fondo, no son tan similares. El operador de doble corchete puede utilizar Ãndices computados. Es decir, que nosotros podemos calcular o generar un Ãndice y meterlo al doble corchete y nos irá a extraer esos elementos que queremos. En este caso, en la lista X, calculamos o generamos una variable llamada name cuyo único elemento es una cadena llamada hola3 y si se lo ponemos al operador doble corchete, nos regresa el elemento puente. En este caso si nosotros pasamos la variable name al operador de signo de pesos no va funcionar. Ahora veamos qué pasa, cuando queremos hacer subsetting de elementos anidados de una lista. Para empezar, lo elementos anidados de una lista, significa que dentro de la lista puede haber otra lista. Que es justamente la lista x que estamos observando en pantalla. Que contiene una lista que tiene los elementos 10, 11 y 12. Y un vector que tiene los elementos 9.8 y 2.33. Si quisiéramos tomar el valor 12, es decir, el tercer valor del primer elemento de la lista X. Entonces lo que hacemos es pasarle únicamente el vector 1,3 entre corchetes dobles. Ahora si queremos utilizar otra notación que sea una notación equivalente. Es usar corchetes, corchetes, uno, que significa ve y extráeme el elemento uno de la lista, que es esa lista, 10, 11, 12. Y luego, otra vez dobles corchetes tres. Que lo que va a hacer es ir a extraer el elemento tres de esa lista que you se generó. El ejemplo de abajo no es más que solamente la misma notación del primer ejemplo. Para ir a acceder el segundo elemento de la lista, el primer elemento de ese vector que nos genera. supongamos que creamos una lista que tenga como elemento, un único elemento que se llame mmmddd223s, es un nombre arbitrario que se me ocurrió solamente para poder ejemplificar lo que vamos a observar. Y este tiene los valores del uno al 35. Es decir podrÃamos mandar a llamar o pedir usando la anotación de doble corchete o de nombres literales, usando la anotación del signo de pesos. Poniendo x$ el valor literal que es mmmddd223s en este caso, te lo podrÃamos poner asÃ. Pero como es demasiado largo o demasiado complicado, podrÃamos hacer uso de lo que se conoce como emparejado parcial. El emparejado parcial, lo que hace es, si no encuentra un sÃmbolo de alguno de los elementos que sea igual, idéntico al que estamos buscando. nos regrese el más cercano, en este caso, si sólo mandamos a llamar con la letra m, es decir, x[[¨m¨]] nos regresa justamente el elemento que estábamos diciendo en un principio, que es un nombre muy largo y muy complicado. Lo mismo pasa con el signo de pesos. Ahora. Este comportamiento se puede cambiar si utilizamos el parámetro exact y le ponemos igual a TRUE. Entonces, cuando hagamos uso de este, de intentar de hacer uso del emparejado parcial, no va a funcionar. Generalmente vamos a encontrar valores faltantes o NA, que you hemos observado qué significan estos valores. Cuando nos encontramos con este tipo de valores, algunas ocasiones vamos a querer eliminarlos y quedarnos sólo con los valores que sean diferentes a NA. El ejemplo que estamos observando, tenemos un vector que contiene NA. Lo que hacemos es generar un vector de valores lógicos, utilizando la función is.na. En éste nos regresará todo un vector que nos contenga los valores verdaderos, donde el elemento sea NA, entonces si lo que queremos es justo lo contrario, entonces tenemos que negar ese vector. Utilizando el operador signo de admiración. Entonces utilizando ese operador y el operador corchetes, podemos pasarle al vector x ese operador y entonces nos regresará sólo los elementos que son distintos de NA. Ahora, supongamos que tenemos un dataframe, y que este dataframe contiene NA en algunas columnas. Cómo le harÃamos para eliminar los renglones que contienen NA sea de la columna que sea. Para eso utilizamos una función que es muy útil conocida como complete.cases(). Esta función lo único que tenemos que hacer es generar con ella un vector lógico, y luego mandar a llamar ese vector lógico, utilizando una operación de corchetes. El dataset airquality, is se lo pasamos a la función complete.cases nos genera un vector lógico, este vector lógico entonces se lo podemos pasar a airquality de nuevo, utilizando la operador corchetes para que nos de sólo los renglones donde los valores sean TRUE. Es decir, quitándonos todos los valores NA que no necesitamos. [MUSIC]