[MUSIC] Otro de los sujetos que son importantes en R son las listas. Las listas no son más que vectores, que ahora sí, pueden contener distintos tipos de datos en él. Este tipo de objeto es muy especial porque nos permite tener y llevar a cabo operaciones que podrían ser complicadas si no existiera. Pueden observar que en la función lista recibe los elementos que van a formar parte de esta lista y lo asigna al objeto x. Los factores son un tipo especial de vectores, estos nos sirven para representar datos categóricos. Puede haber de tipo ordenado o sin orden. Uno puede pensar en ellos como si fuera un vector de enteros, donde cada entero está asignado a una etiqueta en particular. Podemos generar un vector de factores utilizando la función factor(). En este ejemplo podemos ver que la función factor nos ayuda a generar un vector de factores. En este caso el vector x ahora tiene los valores yes yes y no y los niveles, como se le conoce a los factores, son no y yes. Como no pusimos explícitamente que tiene que ir en un orden. No aparece primero y yes aparece en segundo. Otra cosa muy bonita de este tipo de dato es que, si utilizamos la función table, lo que hace es nos tabula cada uno de los factores y la frecuencia con la que está apareciendo en el vector que estamos observando. Con la función unclass, en este caso, lo estamos usando solamente de manera ilustrativa para mostrar que a cada uno de los factores o de los niveles que estamos teniendo, va asociado un número entero. Es decir, nosotros podríamos tener entonces un vector de puros valores enteros que van asociados a una etiqueta, en este caso, las palabras yes Y no. El orden de los niveles se puede establecer dentro de la función factor, utilizando el parámetro level. Éste no es más que un vector indicando el orden en el que van a ir. En este ejemplo utilizamos ahora, en vez de las respuestas en inglés yes y no. Ahora utilizamos las palabras si y no, y establecemos que sí va primero, y no, va en segundo lugar. Al mandar a llamar el vector de factores, podemos observar que ahora sí, aparece en primer lugar, y no, aparece en el segundo lugar. Cuando hay un valor que está faltante, se utiliza un valor particular para rellenar ese valor faltante y, esto se indica con el carácter NA, o NaN, dependiendo del tipo de valor que esté faltando. NA significa not available y NaN es not a number, que you vimos como podemos también generar un valor de este tipo. Hay maneras de poder ver si un valor o un elemento de un vector es de tipo NA. Y también si es de tipo NaN. Es importante conocer que NA no necesariamente tiene que ser un NaN. O sea, ambos son valores faltantes, pero a veces pueden ser de tipo numérico, como NaN, que al mismo tiempo puede ser un NA. Los valores NA también tienen una clase, hay enteros NA, caracteres NA. Pero es importante acordarse que un valor NaN es al mismo tiempo un NA, pero no al contrario. Por ejemplo, el vector X tiene un valor NA. Si probamos con la función is.na, podemos ver que en el lugar número tres donde teníamos un NA dice TRUE, es decir, que ese valor sí es un NA. Pero si probamos si es un NaA, con la función is.nan, podemos ver que el valor tres no es un na, por eso le pone FALSE. En la segunda asignación del vector X, podemos ver que el elemento número tres es un NaN y el elemento número cuatro es un NA. Y si hacemos la pregunta de si es NA, ambos van a ser verdaderos. Por lo cual, justamente estamos comprobando lo que dijimos, que un valor NaN puede ser al mismo tiempo un NA, pero no al contrario. Los dataframes se representan en R como una lista muy particular, donde cada uno de los elementos de la lista tienen el mismo tamaño. Cada uno de estos elementos se puede ver como una columna, y la longitud de cada elemento es el número de renglones que se tiene. La forma tabular de los dataframes les puede recordar una matriz, pero recordemos que la matriz es un tipo particular de vector. Es decir, que tiene la limitante que todos los elementos de la matriz tienen que ser del mismo tipo o clase. Mientras que en un dataframe. Eso no es necesario, como es una especie de lista cada uno de los elementos de la lista, es decir, cada una de las columnas puede tener un tipo distinto o una clase distinta. Un atributo particular de los dataframes, es que cada una de las columnas puede tener un nombre, al igual que cada uno de los renglones. Y estos son conocidos como row.names y col.names. Ahora, ¿cómo generamos un dataframe? Es muy fácil, hay varias maneras, una es usando la función data.frame().Lla segunda es utilizando las funciones read.csv() o read.table() que lo que hacen es leer de un archivo o de una conexión. A un archivo los datos, y los va metiendo de manera tabular, y también podemos convertir una matriz a un dataframe utilizando la función data.matrix(). En este ejemplo podemos ver como formar un dataframe utilizado la función data.frame. La función recibe separado por comas. Primero el nombre de la columna que vamos a utilizar y luego un signo =, y seguido de los elementos que van a llenar esa columna. En este caso tenemos dos columnas, columna una que son los valores del uno, dos, tres y cuatro, y la columna dos que tiene los valores TRUE, TRUE, TRUE y FALSE. Podemos preguntar por los renglones, el número de renglones y el número de columnas, usando la funciones nrow(x) y ncol(x), al objeto que es ese dataframe. Que en este caso se llama X. Y finalmente una cosa que es importante recordar, es que el tamaño de cada una de las columnas tiene que ser el mismo. Por ejemplo, en el error que estamos viendo al final, estamos tratando de meter primero en la columna uno, cinco elementos. Y en la columna dos, que desde cuatro elementos, entonces cuando intentamos generar un dataframe con eso, nos dice que hay un error porque hay un número diferente de renglones. Podemos poner nombres a los objetos. Los nombres no son más que un tributo que nos permite describir de manera perfecta de qué trata un renglón o una columna. Podemos poner nombres a las listas, a las matrices y, también, a los dataframes. Podemos ver en este ejemplo que tenemos el vector x, que consta de los elementos 11, 12, 13, 14. Podemos ponerle nombre a cada uno de estos utilizando la función names y modificándola con una asignación de un vector que tiene cada uno de los nombres de cada elemento como un carácter. Si en el segundo ejemplo, lo que estamos generando es una lista donde cada uno de los elementos you tienen un nombre, si mandamos a imprimir la lista, nos aparece que ahora cada uno de los elementos tiene un símbolo de pesos y el nombre. Como you dije, las matrices también pueden tener nombres y podemos usar o asignar estos nombres utilizando la función dimnames, donde podemos ponerle nombres a cada una de las dimensiones. Ésto lo hacemos modificando ese atributo pasándole una lista o asignándole una lista a este atributo. Donde cada uno de los elementos van a ser vectores de los tamaños de cada dimensión de la matriz. [MUSIC]