
Edgar Ruiz | Programación con R | RStudio (2019)
Hay ocasiones que, cuando trabajamos en un análisis en R, necesitamos dividir nuestros datos en grupos, y después tenemos que correr la misma operación sobre cada grupo. Por ejemplo, puede ser que los datos que tenemos contienen varios países, y necesitamos crear un modelo por cada país. Otro caso sería el de correr múltiples operaciones sobre los mismos datos. Estos casos requieren que sepamos cómo usar iteraciones con R. Este webinar se concentrará en cómo utilizar el paquete llamado purrr para ayudarnos a resolver este tipo de problema. Descargar materiales: https://rstudio.com/resources/webinars/programacio-n-con-r/ About Edgar: Edgar Ruiz es un Ingeniero de Soluciones en RStudio. Es el administrador de los sitios oficiales de sparklyr y de R para bases de datos. También es autor de los paquetes de R: dbplot, tidypredict y modeldb, y co-autor de el paquete dbplyr
image: thumbnail.jpg
Transcript#
This transcript was generated automatically and may contain errors.
Bienvenidos a todos. Muchas gracias por estar aquí con nosotros hoy en su tarde. Vamos a hablar hoy con respecto a Programación con R. Lo primero que quiero mencionarles es que todos estos materiales y también la grabación de este webinar van a estar disponibles en nuestro lugar de internet. Al final de la presentación voy a enseñarles dónde se puede ir a obtener una vez esté el video disponible y también todo lo que vamos a utilizar hoy como la presentación que tengo aquí en la pantalla y también todos los materiales como el código y la información que vamos a utilizar.
También quiero hablarles de que aquí tuve un screenshot de un proyecto y no pueden ver mi pantalla. Hay una manera en que ustedes pueden hacer preguntas que yo después de hacer la presentación y si tenemos tiempo voy a tratar de responder. Así que donde dice preguntas, en la parte como de hasta abajo de la interfaz de CodeMeeting, ahí pueden poner una pregunta y voy a tratar de contestarla después de la presentación. Otra vez muy agradecido por parte de mi propia y también por parte de RStudio de que ustedes estén aquí en su tarde y vamos a empezar con la presentación.
El Tidyverse y la ciencia de datos
Lo primero que quiero hacer es hablar del Tidyverse. La primera sesión que tuvimos de webinar introdujimos el Tidyverse y hablamos más profundo de qué quiere decir, qué es lo que hace y hicimos unos ejemplos. Y lo que quiero hacer es que mientras ustedes vean los otros dos webinars que nosotros hemos hecho aquí en RStudio en español, que vean que estamos poco a poco agregando información y también aprendizaje de una manera en que se pueda, si ustedes ven los tres vídeos uno tras otro, hay una historia. Algo que ustedes pueden ver desde un principio a un final y ojalá que esto les ayude a obtener más conocimiento en cómo hacer ciertas cosas con R.
Entonces el Tidyverse, hablando de él, el Tidyverse es realmente una colección de paquetes de R. En R tiene como 13 mil paquetes ahora y el Tidyverse es un grupo relativamente pequeño de esos 13 mil paquetes que están diseñados para que funcionen todos juntos bien. Uno de los más famosos del Tidyverse es el Declare o también DigiCloud, que están diseñados para que usted pueda ir de datos a visualización muy fácilmente. La meta del Tidyverse es de poder resolver problemas que son complicados mediante la combinación de diferentes piezas. Entonces si usted se imagina así los Legos, cuando usted quiere hacer una casa de Legos o algo así, no va a utilizar la misma pieza para poder armar algo complicado como una casa, sino que utiliza diferentes piezas para poder armar algo así tan grande.
Podemos ver que hay hasta esculturas que hacen gente profesional con estos Legos que son bien impresionantes, que son más grandes que una persona y toman mucho tiempo hacer, pero gracias a que todas estas piezas caben y que son exactamente diseñadas para que puedan caber con una con otra, pueden hacer esto. Y así es como funciona el Tidyverse. Queremos que todas las piezas puedan caber bien para que usted pueda resolver problemas complicados por medio del análisis de datos.
Entonces la vez pasada hablamos de la ciencia de datos y cada de los pasos de la ciencia de datos y como cada de estos pasos hay un o varios paquetes de R, especialmente el Tidyverse, que ayudan a poder hacer esa tarea más fácilmente. Por ejemplo, si usted quiere leer datos, lo puede hacer fácilmente con un paquete como ReadR o Arvest. Si quiere ordenar, puede usar TidyR, transformaciones por medio de DeepLayer, visualizaciones por ggplot. Y así puede hacer todos estos pasos muy fácilmente hasta el punto que uno llega a comunicar.
Si usted quiere hacer un análisis de datos, todos estos paquetes funcionan muy bien, pero hay veces de que la tarea que tenemos que hacer en uno o varios de los pasos es un poco más complicado. Y usualmente esa complicación es muy común que pase cuando usted necesite hacer un tipo de repetición o lo podemos llamar un ciclo o una iteración. Aquí como los ejemplos que tenemos es si usted necesita leer múltiples archivos en una sola tabla, que es una cosa muy común que pasa cuando estamos trabajando con datos en R, que tenemos varios archivos. Todos representan un segmento, una parte o una cantidad de tiempo de los datos que tenemos que analizar y los tenemos que poner todos juntos y después analizarlos en un solo.
También hay ocasiones donde tenemos que transformar grupos de datos. Entonces que tenemos todos estos datos disponibles en una tabla y ahora queremos correr, digamos, un modelo por cada un grupo. Si tenemos una tabla que tiene muchos países, queremos correr un modelo por cada país, tenemos que hacer esas transformaciones primero y después hacer este tipo de iteración o de ciclos. O también si queremos comunicar en el otro lado, si queremos crear múltiples reportes que estén divididos dependiendo cierto segmento, digamos, como el ejemplo que vamos a estudiar hoy por alumnos o por países o por lo que sea, uno tiene que saber cómo hacer esto también. Y no solo hacerlo en R, pero de una manera que es eficiente, que tampoco involucra que nosotros tengamos que hacer cada reporte manualmente.
Y eso es lo que queremos hacer hoy. ¿Qué técnicas podemos utilizar para poder completar estas tareas sin tener mucho esfuerzo y también por medio de una manera que quepa muy bien o que cuadre muy bien con el Tidyverse?
Funciones vectoriales
Lo primero es platicar de funciones vectoriales. Funciones vectoriales van más allá del Tidyverse. Hay muchas funciones que tienen este tipo de soporte que la podemos utilizar afuera del Tidyverse, pero dentro del Tidyverse también hay funciones que trabajan así y son las primeras que nosotros tenemos que ver para hacer este tipo de repeticiones. Por ejemplo, si queremos hacer una... tenemos que extraer el nombre de un archivo de varios archivos que tenemos en una variable, hay una función que se llama pathfile. Y pathfile, usted puede pasarle múltiples valores y esta función automáticamente va a repetir la misma operación sobre cada uno de estos valores y darle el archivo final. Así que yo no tengo que preocuparme por hacer un for loop o un while when para poder sacar el nombre de cada uno de los archivos. Esto automáticamente lo puede hacer pathfile.
Voy a cambiarme aquí al código para enseñarles cómo trabaja esto. Entonces voy a cargar la librería Tidyverse y ahora vamos a cargar la librería fs. Si no ha utilizado fs, les recomiendo mucho este paquete porque ayuda bastante con respecto al manejo de archivos. Entonces, si cargo fs, dir ls va a darme el listado de los archivos dentro de una carpeta. En este caso, la carpeta donde yo estoy trabajando.
Si yo corro este aquí, me va a dar todos los archivos que tiene, que empiezan con el nombre datos. Y como puede ver aquí, me da tres archivos. Entonces ahora que tengo estos datos y lo puedo cargar en una variable, puedo utilizar esta variable como para pasarla a una función vectorial. Entonces, en lugar de hacer esto aquí, si yo quiero ir al siguiente paso que se llama fileInfo, que si yo quiero ver la información del tercer grado, del archivo que tiene tercer grado, uso fileInfo y después cuarto grado, después quinto grado. Obviamente esto no es práctico porque si ya tengo más grados tendría que agregar otra línea y toda la información me viene una en cada resultado. Lo que yo quiero es de que todos estos resultados estén en una sola tabla. Y ahí es donde estamos hablando de que fácilmente yo puedo pasar fileInfo archivos y cuando yo hago esto, ya me da una sola tabla con la información de los tres archivos.
Y esto es gracias a que en fileInfo, si yo voy a la información de ayuda, usted ve ahí que el path, que es el que estoy pasando ahorita, dice que es un vector alfanumérico de uno o múltiples archivos. O sea, cuando usted mire este nombre aquí, vector of one or more, uno o más, eso es una muy buena indicación de que esto es una función vectorial. O sea, que yo no tuve que escribir un for loop para que me diera la información de cada uno, sino que simplemente pasé la variable.
También hay otros paquetes dentro de Tidyverse que hace esto, como StringR. O sea, que tenemos archivos, que tiene los tres archivos, y lo que yo quiero es remover la parte que dice datos de cada uno. Entonces, en lugar de hacerlo uno por uno, simplemente le paso el nombre de archivos y ya me hace la repetición por los tres automáticamente. Gracias a que este es parte del Tidyverse, yo fácilmente puedo hacer un pipe y pasarlo al str.remove, que es el que remueve datos, y también quiero que remueva grado.csv. Entonces, hago los tres y automáticamente me da el resultado que solo quiero ver qué grado tiene cada archivo.
El paquete purrr y la función map
Lo siguiente que quiero demostrar es cuando tenemos que hacer múltiples ciclos. Y en este caso vamos a hablar del paquete purrr. Es el que estuvimos anunciando en el anuncio de este webinar. Y la razón que lo hacemos es porque ahí es realmente ya cuando no hay funciones vectoriales que podemos utilizar, cuál es la manera más eficiente que nosotros podemos hacer para poder hacer este tipo de ciclos o repeticiones.
Como un problema que queremos resolver, es el que hablamos anteriormente, es el de leer cada uno de los tres archivos y después tenerlos todos en una sola tabla. Como se recuerda, tenemos los tres en tres grados, los tres en un archivo csd. Y lo que queremos hacer es leer los tres y después poder utilizarlos en R. Pero lo que no queremos hacer es que escribamos tres veces readcsv o ponerle un ciclo. Lo que queremos hacer es cuál es la manera más fácil. Y ahí es donde viene purrr.
Fácilmente puede utilizar una función que se llama map. Y la función map está esperando dos cosas. Espera que usted le pase un grupo o una lista. Algo que usted quiera que se quiera repetir. Y la segunda cosa que espera es la función o qué operación es la que usted quiere que pase sobre ese grupo o lista. Como puede ver aquí le estamos mandando tres archivos y queremos que corra la función readcsv. Y esto es lo que podemos ver aquí.
Voy a cambiarme otra vez al código. Antes de seguir con el código, quiero asegurarme de que puedan ver el RStudio. Déjenme preguntarle aquí a mi compañero. Robert, ¿puedes ver mi pantalla de RStudio? Sí, puedo ver la IDE. Perfecto, gracias.
Si usted puede ver, me acabo de cambiar de regreso a RStudio. Y puede ver que tengo exactamente la función que tengo marcada aquí. Entonces vamos a leer archivos que tienen los tres archivos y después hacer readcsv. Si hago esto, noté que automáticamente lee los tres archivos y me regresa un objeto lista. Obviamente no vamos a ver el objeto lista porque no lo cargamos a una variable. Pero si hacemos esto y vamos a mi ambiente, usted puede ver una lista de tres.
Y eso es lo bonito de MAP. Porque si usted ha utilizado R por algún tiempo, usted sabe de elapply o apply o esapply y la pregunta es por qué no mejor utilizamos esa función base. Y realmente lo puede utilizar. Lo único que pasa es que con funciones apply a veces no es predecible qué tipo de output o resultados usted va a tener. Puede ser que el resultado sea un vector, o sea una lista, o sea un alfanumérico. Con MAP el resultado siempre va a ser una lista. Entonces cuando ya tiene algo así tan predecible y fácil de usar, es mejor este tipo de cambio. Lo hace más fácil, especialmente para una persona que utiliza este tipo de funciones para hacer análisis. Así que si usted utiliza apply hoy, considera utilizar MAP en el futuro.
Con MAP el resultado siempre va a ser una lista. Entonces cuando ya tiene algo así tan predecible y fácil de usar, es mejor este tipo de cambio.
Otra ventaja que usted tendría en utilizar MAP es de que MAP no está solito. Tiene una familia. MAP tiene otras funciones que empiezan con MAP. Y si pensamos en lo que quiere decir MAP, que es mapear, esencialmente lo que está haciendo, si regreso aquí a la anterior, es de que está como haciendo un mapa. Digamos que usted quiere hacer un mapa de su vecindario y quiere asegurarse de que le hable a sus vecinos. Entonces usted tiene el listado de vecinos y el anuncio que quiere hacer. Entonces él está haciendo un mapeo, ¿verdad? Y todo lo que está haciendo aquí, en el siguiente que estoy mostrando, es de que es la misma operación, pero lo que queremos hacer es de que el resultado sea un poco diferente. Que en lugar de ser una lista, el mapeo devuelva un vector alfanumérico o un vector numérico o que regrese una tabla o un vector que sea integer o numérico entero o verdadero o falso. Entonces nos da varias opciones para que nosotros podamos tener los valores que necesitamos exactamente.
Inicialmente, en este slide que tengo aquí, yo tenía básico y avanzado, pero realmente no es cierto. Vamos a ver una función que se llama transpose hoy y también vamos a ver una función de MAP table. El consejo sería que empiecen con este listado de aquí a practicar estas funciones y después pueden practicar estas. No son más difíciles, simplemente no son tan populares como algo como estos de aquí. Así esto le ayuda poco a poco a poder hacer este cambio, a utilizar este tipo de operaciones.
Leyendo múltiples archivos con map
Así que ya que tenemos estos ejemplos, regresando aquí al ejemplo que les estaba demostrando, una vez que ya tengan todos los archivos mapeados, el siguiente paso que hago aquí es ponerlos todos juntos en una sola tabla. BindRows es un comando que viene del paquete de dplyr que toma un montón de tablas y las pone todas juntas. Si yo corro esos dos, uno después del otro, el resultado ya no es tres tablas sino que es una tabla. Y ya tiene toda la información que yo quiero. O sea que en lugar de yo preocuparme por cargar cada archivo personalmente y después pasarlo por otro programa para que me dé una tabla, ya con dos líneas ya puedo hacer esto.
Pero aún mejor, en lugar de hacer esto, tal vez utilizamos uno de la familia de map, como este, mapdfr, que regresa una tabla que se arma por línea. Que va a ser lo mismo entonces que el BindRows, pero sin yo tener que llamarlo. Entonces en lugar de hacer map y BindRows, solo hago mapdfr y ya me da una tabla completa.
Entonces aquí ya tenemos la tabla que quisiéramos utilizar, pero hay un problema. Si usted se da cuenta, no hay un grado. No sabemos en qué grado está cada alumno. Simplemente sabemos sus resultados, su matrícula y su otra información, pero no sabemos en qué grado está. Y como es bastante común con respecto a este tipo de datos, es de que usualmente la codificación de una información así no está en la tabla, sino que muy usualmente está en el nombre del archivo. Y yo pienso que somos como ahorita como 70 en este webinar. Si hacemos la pregunta de los 70, digo que casi todos vamos a decir que nos ha pasado eso. Y si no le ha pasado, le va a pasar muy pronto.
Así que quería hacer esta demostración también con este tipo de problema. Entonces hay datos dentro del nombre del archivo que queremos extraer. Lo bueno es de que todas estas piezas, estos legos que utilizamos del Tidyverse, avanzan tan bien que podemos resolver este problema bien fácilmente.
Entonces lo primero que vamos a hacer es de que vamos a utilizar el Pipe. Si usted nota aquí, el Pipe podemos hacerlo y dirigirlo al MapTFR y me da exactamente el mismo resultado. Esto no es un problema. Quiero empezar con esto para que vea las diferentes maneras que uno puede hacer. Y la otra cosa que quiero decir rápidamente es de que el paquete FS me regresa los tres archivos que empiezan con datos, pero también hace otra cosa muy importante. Si usted ha utilizado la función Names, nota que tiene nombres. Cada uno de estos tiene un nombre y automáticamente lo que pasa es de que FS le asigna el nombre a cada uno de los archivos y el nombre de ese archivo es el mismo nombre del archivo. Eso quiere decir que el nombre o la identificación de cada uno de estos ya está automáticamente preparada para nosotros.
¿Por qué es eso importante? Porque gracias a que utilice FS, en lugar de otras funciones que no van a hacer esto, cuando yo utilice MapTFR, dentro de MapTFR yo puedo pasar una identificación. Automáticamente MapTFR va a buscar el nombre o los Names y va a decir que esa es la identificación de cada una de estas entradas. Entonces yo puedo pasar el nombre del archivo como la identificación y le digo que le ponga la columna de nombre archivo. Entonces cuando yo corro esto, noté que ahora ya tengo una nueva columna, una nueva variable que tiene el valor del archivo.
Yo cuando hice, tenía que hacer esto antes de aprender todo esto del Tidyverse. Esto no hubiera sido en dos líneas. No sé si para ustedes es diferente. Pero esto es increíblemente poderoso. La función de FS con la función de MapTFR resuelve tantos problemas que podemos ver ahí y muy fácilmente y lo podemos leer fácilmente.
La siguiente cosa que queremos hacer es de que como seres humanos, nuestro cerebro automáticamente sabe leer que ese es el tercer grado. Yo estoy viendo quinto grado. Porque automáticamente podemos descartar estas dos partes y solo concentrarnos en el centro. Pero obviamente cuando hacemos el análisis de datos no queremos toda esa información. Solamente queremos el grado. Para eso podemos utilizar la función Separate que la utilizamos en nuestro primer ejercicio, en el primer webinar. Lo que hacemos con Separate es de que toma el archivo y automáticamente Separate lee cualquier carácter o cualquier letra que sea más con puntuación. O sea, que todo lo que es el guión bajo o coma o punto, lo va a considerar como una separación.
Entonces si yo paso archivo y que me lo separen diferentes columnas, en este caso 1, 2, 3 y 4, entonces lo que yo espero es de que me dé 1, 2, 3 y 4. Cuando lo corra es exactamente lo que yo esperé. O sea, datos, cuarto grado, CSV. Cada uno en su propia columna. Y como usted puede notar yo los nombré en español, así que no importa el nombre. Lo único que importa es que yo le pase una información. La otra cosa que tiene Separate es que empieza de la izquierda a la derecha. Y si yo no nombro cosas a la derecha, simplemente no las importa. Entonces si yo simplemente digo que me importe 1 y 2 y corro esto de nuevo, note que 3 y 4 no me dio un error en primer lugar, que es lo más importante. Simplemente me dio un warning, que no es un problema. Pero sí me trae el número 2, que es el valor que yo necesito, y 1.
Pero hay otro truco que Separate tiene. Separate, si usted le pasa un NA en el lugar donde está la variable que usted no quiere, automáticamente Separate le va a descartarlo. Entonces en lugar de pasarle 1 y 2, aquí le paso grado. En lugar de hacer estos dos pasos de 1 aquí y después quitarlo, simplemente le paso NA y ya solo queda grado. O sea que ya voy con 3 líneas. Fui desde traer todos los archivos, leerlos, agregarle el nombre del archivo y después sacar el nombre del grado.
Yo puedo hacer esto muy fácilmente. En lugar de empezar con archivos, puedo decir que empieza con gear.ls, que es la función EFS, que haga la lectura de los archivos y que me separe el grado. Todo en un paso. Son tres funciones bien pequeñas que hacen todo lo que hemos estado aprendiendo paso a paso aquí. Lo hace rápidamente. Porque yo estoy empezando con gear.ls, si mañana yo agrego otro archivo aquí, yo no tengo que cambiar ningún solo código. Solamente corro otra vez la información, el código, perdón, y ya me da la nueva información. Podemos ver qué poderosa es la combinación del tidyverse.
Limpieza de datos y grupos con dplyr
La siguiente cosa que quiero hacer es limpiar los datos, porque como recordamos y si vamos al primer webinar, estos no son datos limpios. Porque aquí hay dos observaciones, no solo es una. Para que sean datos limpios, cada línea tiene que ser una observación. Entonces lo que queremos hacer es que inglés y matemática estén en su propia línea. Este es el, yo copié exactamente como está en la primera, en el primer ejercicio del webinar, el primer webinar, los mismos pasos. Así que datos limpios, no voy a hablar mucho de este, pero es separate otra vez, ya hablamos de separate. Y después usa gather para hacer una línea por cada uno. Pero más información está en ese webinar. Y aquí ya tenemos unos datos limpios o tidy data. Cada una de las líneas es un grado o un puntaje, ¿ok?
Usualmente lo que haríamos si queremos hacer grupos, con estos datos utilizamos groupby. Si queremos el promedio por cada materia, por cada persona o matrícula de los estudiantes, simplemente hago groupby y después sumarizar cada puntaje. O sea, hago min de los puntos y ya tengo el promedio. Esto sería, esto es lo que utilizamos, yo digo el 80% del tiempo. Pero ¿qué pasa cuando necesitamos hacer algo más complejo con cada uno de estos grupos? ¿Qué pasa si quisiéramos correr tal vez un modelo por cada uno de estos grupos? No podemos correr aquí un LM, ¿verdad? No funciona de esa manera.
Entonces, ¿de qué manera es, cómo podemos hacer este problema? O sea, que vamos de funciones vectoriales a funciones con purrr y cómo podemos hacer esos ciclos y ahora cómo podemos hacer este tipo de grupos, operaciones por grupos. Regresando a la presentación, vamos a hablar de grupos de datos con dplyr. dplyr es, obviamente, donde vamos a hacer las transformaciones de datos. ¿Qué es exactamente lo que esto es? Ya tenemos los datos limpios, o sea, que fuimos de leer, de limpiar y ahora vamos a transformar. Las transformaciones las hacemos con dplyr y dplyr tiene una función que es muy importante.
Pero antes de ver esta función, quiero hablar de los Tables. Algo muy interesante de que provee el Tidyverse es este tipo de como tablas o super tablas que se llaman Tables. La razón es que no son DataFrames o tablas, es de que Tables tiene, entre varias cosas que hace, una de las más importantes es de que deja que uno tenga grupos de otras tablas como variables dentro de tablas. O sea, que puede tener tablas dentro de tablas. Como ve aquí, como traté de hacer este ejemplo, tiene una tabla. Dentro de la tabla tengo otra tabla y cuando uno la mira, cuando uno corre y quiere ver cómo se imprime esta tabla, va a ver que dentro de los datos dice, te voy. Pero dentro de ese dato es que existe una tabla.
Esto es importante saber porque, como estaba diciendo, dplyr tiene una función que se llama GroupNest. GroupNest automáticamente cambia, en lugar de ser simplemente un grupo, va a crear un grupo y el resto de la información la va a poner como filtrada dentro de un T-Ball dentro de la tabla principal. En este caso tenemos dos personas. Tenemos Juan1 y Sofía2 y tenemos dos entradas por cada uno. Entonces, en lugar de agruparlos como GroupBy hace, cuando yo hago GroupNest nombre y apellido, me va a crear dos tablas que van a tener estos, cada uno va a tener estos dos valores y estos dos valores. Cuando yo abra esta tabla aquí de Juan1 va a decir enero 10 y va a decir febrero 10. Y cuando abra el de Sofía va a decir febrero 20 y enero 5.
La otra cosa que podemos hacer es que una vez ya estén dentro, cada uno estén dentro de su tabla, yo ya puedo correr una operación más compleja usando map y mutate. Mutate va a crear la nueva variable y map va a correr la función dentro de este T-Ball y me va a dar el resultado en otra columna. Pero como T-Ball es bastante flexible, la columna va a ser un objeto LM, en lugar de ser unos datos o algo así. Entonces la combinación, ahora todo se está juntando, ¿verdad? Empezamos con purrr y ahora estamos en dplyr y en los webinars anteriores hemos hablado de dplyr. O sea que todo vemos cómo encajan tan bien y lo podemos encajar para hacer este tipo de operaciones más complejas como estaba hablando en el principio.
Modelos por grupo y predicciones
Ahora veamos cómo funciona esto. Regresando aquí vamos a los grupos de datos. Como prometido vamos de los datos limpios al grup nest. Se acuerda que hicimos group by aquí, pero aquí vamos a hacer group nest y en lugar de darme una sumarización simplemente me está dando el resto de los datos en tablas individuales. Lo que voy a hacer es voy a agregar estos resultados en la variable grupos y para demostrar de que podemos ver los datos puedo pedir que me dé la primera línea que sería éste aquí y voy a utilizar el comando pull para que me dé los datos de la columna data. Puedes ver que es Elena Jiménez y tengo un problema aquí con la impresión pero puede ver ahí el nombre Elena Jiménez y puedo ver aquí que aunque yo no pueda leer Elena Jiménez aquí yo sé que esos datos están adentro de este tíbulo.
Antes de ir al siguiente paso que sería, ok ya tenemos todos estos en su propio tíbulo, ahora quiero poder correr un modelo por cada uno. Pero antes de hacer esto quiero introducir otra idea. ¿Se acuerdan de que podemos hacer este tipo de mapeo así? O sea que va a map str2oper y ya me da la mayúscula de todo. Obviamente esta es una función vectorial y podemos hacerlo de otra manera pero para hacerlo fácil simplemente quiero mostrar aquí.
De otra manera que puedo hacer esto es mediante utilizar este símbolo, usamos ñ y cuando pasamos este tenemos que pasar .x que es el nombre del archivo o sea que si yo paso sin str2oper simplemente está pasando el .x llega a ser esa variable. Si hago algo así como names.x me da los nombres. Entonces si hago str2oper me da exactamente los mismos resultados que con este.
Lo siguiente que quiero hacer es que cuando utilizamos esta función así es porque sólo vamos a correr una función. Pero si yo quiero correr más de una función o algo un poco más complejo entonces tengo que utilizar este tipo de operación así con la ñ y con el .x. En este caso quiero hacer dos funciones. Quiero que le quite datos y que después se sea str2oper y ya lo hace así. O sea que puedo hacerlo de estas dos maneras pero tenemos que hacerlo de esta manera cuando hacemos una operación más compleja. Es algo un poco más nuevo que tenemos que aprender pero créame vale la pena practicarlo. Cuando uno puede hacer esto fácilmente es tan poderoso y esto es lo que utilizo todos los días. Cuando hago una operación usualmente termino algo así con este tipo de operación.
Cuando uno puede hacer esto fácilmente es tan poderoso y esto es lo que utilizo todos los días. Cuando hago una operación usualmente termino algo así con este tipo de operación.
¿Qué es lo que vamos a ver aquí? Ahora que ya tenemos grupos y cada grupo es un t-ball vamos a hacer map el dato que está aquí en el t-ball. Después vamos a decir que corra un modelo de regresión linear pero como el valor que va a pasar no es el primero sino que es realmente el último por eso estamos usando la ñ y el .x al final como data igual el .x. Cuando corre aquí ya me da mi modelo y todo está dentro del t-ball.
Ya después puedo hacer otra cosa que sería usar este modelo para hacer una predicción. Llegamos hasta el mes 6 en estos datos así que voy a pasar el mes 7 para hacer una predicción y voy a hacer lo mismo si nota que es la misma cosa pero en lugar de usar la columna data voy a usar la columna model para que me haga la predicción. Voy a correrlo ya tengo aquí la predicción. Como usted nota está dentro de una lista es un resultado dentro de una lista que es doble o numérico. Yo quisiera no ver esto porque eso es decir que es un número yo quisiera ver el número así que como sabemos que map siempre me va a dar un listado se acuerda cuál es el que tiene que usar para que me dé un número.
Un vector numérico puedo utilizar map double. Si voy aquí y utilizo map double ya me da automáticamente una versión que es el número ya que no me da la lista es algo más conveniente. Así que no tengo que ir de aquí a hacer después un mutate o algo así para convertir esto a double simplemente utilizo map double. Así que utilizamos otro familiar de map.
Y como armamos esto poco a poco a veces cuesta un poco ver qué tan fácil es hacer todas estas operaciones así que las puse aquí. Vamos de datos limpios a group nest y después los dos mutates. O sea que fuimos con tres acciones rápidamente hicimos un un modelo por cada uno de los estudiantes por 48 estudiantes o sea que hicimos 48 modelos 48 predicciones sin nada.
Transpose y generación de reportes automáticos
Ok vamos un poco más allá. Se acuerda que platicamos de que vamos a aprender de transpose. Y transpose si vamos aquí dice convierte los valores de columnas a líneas. ¿Qué es lo que quiere decir eso? Si voy aquí y corro esta operación me va a dar tres columnas porque estoy haciendo un group by y después simplemente que me dé la sumarización. Si uso map sobre esta tabla de lo que estoy haciendo aquí por medio del pipe es de que en lugar de darme una entrada por cada línea me están dando una entrada por cada columna y eso es lo que pasa cuando combinamos map con tablas. Map automáticamente si no lo paso como lo hice aquí en mutate pero lo estoy pasando completamente la tabla al map me lo va a pensar que cada una de las entradas es una de las columnas.
Eso lo resolvemos con transpose. Si utilizo transpose y le enseño aquí todos los estudiantes note que cada estudiante llega a ser un número. Esta es una entrada. Entrada 2 es Alberto Ramírez, entrada 3 es Rodrigo Hernández, entrada 4 y así cada entrada llega a ser una de las líneas. Entonces si se tiene que acordar map para columna y transpose para línea. Y esto es muy común porque usualmente necesitamos hacer este tipo de operaciones por cada línea. Si la línea no es algo más agregada como sería que tuviéramos que utilizar map nest entonces utilice transpose. Ya le va a dar la lista como uno necesita utilizarla.
¿Por qué esto es importante? Porque la última cosa que quiero enseñar hoy es de que después de que ya tenemos los estudiantes ya puedo pasar otra función map. O sea que estudiantes se acuerda que tiene una entrada por cada estudiante. Ya puedo pasar un map double y que me dé el número de la matrícula ya porque cada entrada es un estudiante, es una línea. Esto lo podemos utilizar porque a veces queremos hacer reportes automáticos. En el webinar previo hicimos algo bien similar. Utilizamos un reporte para poder automatizarlo y que genere varios reportes basados en la matrícula.
Pero qué pasa si lo que queremos hacer es de que puede pasar más información que solo la matrícula. La vez pasada solo hicimos un punto de información. En este caso necesitamos más. Y por eso es que transpose es tan importante porque ya la información está preparada para que yo pueda usar map contra una tabla que fue pasada por transpose. Ya cuando haga esto lo que va a hacer aquí es de que va a tener este documento, este R Markdown que tiene parámetros y el parámetro es matrícula. Yo estoy pasando aquí el parámetro matrícula, que el nombre del archivo lo voy a hacer aquí y que vaya a este folder que se llama tarjetas. Cuando yo corro esto y me voy al folder tarjetas, puedo ver aquí como cada repetición, cada reporte está siendo generado automáticamente. Yo sé que estos reportes van a ser generados por código así que no van a tener errores de que alguien ha entrado la información incorrecta.
Mientras está trabajando puedo abrirlo aquí. Esta es la tarjeta de estudiante que tiene un chichiplot con el nombre del estudiante. Puedo abrir otro aquí, Rodrigo Hernández. Aquí tengo a Rodrigo Hernández. Sé que creo cada uno de los reportes solamente corriendo este código.
También podemos hacer lo mismo gracias a una nueva integración que tenemos con PowerPoint. Puedo hacer lo mismo con PowerPoint. Aquí tenemos la misma idea de que podemos generar cada archivo de PowerPoint y pasarle la misma información. Si voy aquí a presentación, tarjetas, aquí el output es PowerPoint Presentation que es el punto principal y la misma idea de que podemos pasar el parámetro con matrícula. Hacemos un chichiplot. Pero algo interesante aquí es que utilizo un header aquí para hacer un nuevo slide y aquí puedo poner su comentario.
¿Cuál es el resultado de eso? Cuando yo corra este código, que es la misma cosa, lo único que estoy haciendo es pasarlo a un R Markdown diferente que está preparado para hacer PowerPoint. Voy a presentaciones. Está creando la presentación. Voy a abrir una aquí. Aquí tengo los resultados de Alberto y aquí tengo el slide. Y el maestro puede poner su comentario.
Es algo muy común también. Es la razón por la cual nos piden que hagamos PowerPoint, porque quieren poner comentarios. Entonces, ya dentro del R Markdown que usted genera, solamente pone ahí un nuevo slide para que ellos pongan su comentario. Y cada uno de los reportes los genera automáticamente.
Recursos y cierre
Muy bien. Entonces, este es lo que quería compartir hoy. Hay otros recursos disponibles, como las hojas rápidas o cheat sheets o hoja de referencia que tenemos. Tengo aquí el link. Gracias a Carlos Ortega tenemos también la guía rápida para purrr, que es lo que hemos estado hablando hoy. Así que estoy bastante feliz que ya hizo este trabajo. Ustedes pueden bajar la guía rápida y utilizarlo.
También tenemos los recursos en español, especialmente los webinars. Note que tenemos, si se acuerda, Resources RStudio Español. Se pone un bookmark en este link. Aquí es donde vamos a empezar a agregar todos los recursos en español. Obviamente tenemos dos ahora, que son los videos y también todos los materiales que utilizamos durante esos webinars. Entonces, como yo hice bastantes referencias a esos webinars anteriores y si no los han visto todavía, pueden venir acá. Y bien fácil de recordar es Resources RStudio Español. Aquí es donde tienen que regresar también para cuando pongamos el video de hoy, para que lo puedan ver otra vez o lo compartan. Y también pongo aquí unos recursos en inglés. Como dijimos al principio, todos estos materiales van a estar disponibles en ese link de donde está el recurso en español. Y va a haber un link ahí para poder ir a traer todos los recursos.
Entonces, muchas gracias por su atención. Estoy muy emocionado que este ha sido nuestro tercer webinar y primero día vamos a hacer más de estos. Entonces, antes de terminar, yo pienso que tenemos un par de minutos para responder un par de preguntas.
Preguntas y respuestas
Tenemos aquí dos preguntas, creo yo. Sí, entonces tenemos una pregunta. Para devolver un DataFrame, ¿debo usar DFR? Sí, la respuesta es sí. Hay tres funciones. Está MapDF, que es igual a MapDFR. Y también está MapDFC, que es por columna.
Sí, en tu ejemplo, ¿es posible hacer un LM si usas Do? Ok, después de un GroupBy. Sí, puedo utilizar GroupBy si necesita, pero la idea es de que hoy queríamos demostrar GroupNest, que es una de las funciones más recientes de dplyr. Y GroupNest va a poder, con el GroupNest, no solamente puede hacer, como demostramos aquí, no solamente va a poder hacer modelo, puede también hacer las predicciones y realmente expandir lo que puede poner dentro de un T-Vull.
La otra pregunta que tenemos aquí, ¿cuál sería el código si su grupo le quiera agregar una columna? Por ejemplo, poner el número de línea por cada subgrupo en el NestedGroup. Ok, yo pienso que lo que quiere decir es esto. Entonces, supóngase que vamos grupos aquí. Voy a hacer algo que cada presentador sabe que es la regla número uno de no hacer. No tengo que hacer algo en vivo y probarlo por primera vez en vivo, pero vamos a hacerlo ya que no tenemos un poco de tiempo aquí. Vamos a hacerlo rapidito aquí. Entonces, la idea es de que, ¿qué pasa si yo quiero agregarle una columna al T-Vull? Entonces, ya que tenemos data, vamos a hacer data. Así lo haría yo, no estoy seguro si sería así.
Sería algo así, pero no lo estoy haciendo bien ahorita. Lo puede hacer el mutate dentro del map, pero obviamente no lo estoy, no tengo todos los pasos.
Uno de los problemas grandes que he tenido es para cargar bases de datos grandes, se puede alentar bastante el proceso a cargar y varias, crear varias bases de datos, que también funcionan las soluciones Perl y otros metas. Pues usualmente lo que queremos hacer con bases de datos es no cargar todas las bases de datos, sino utilizar otro tipo de métodos. ¿Cómo utilizarlos? Vimos funciones de dplyr contra la base de datos. Así que la preparación de datos no es dentro de R, sino que pasa dentro de la base de datos. Si usted piensa agrupaciones, filtros, selecciones, todo este tipo de operaciones la base de datos lo puede hacer. Entonces es mejor que uno considere este tipo de método.
El lugar de internet debe.rstudio.com es el lugar de internet donde estamos poniendo todas estas ideas. Puede ir a overview y aquí es donde hablamos de este tipo de método. O sea que lo mejor que puede hacer para importar datos de la base de datos es no importar datos de bases de datos. Trate de evitar eso.
Para los modelos generados LLM se puede definir el nivel de confianza que se quiere, si se puede. Simplemente tiene que agregar la... esto sería la predicción. Cuando utilice la predicción aquí le agrega el confidence o prediction interval.
Tengo una lista de dataframe de distintas dimensiones. Quiero crear un solo dataframe. Tiene las filas y columnas con N cuando no se aplica dimensionalidad mayor. Es posible con métodos iterativos. Sí, se puede hacer esto. Se puede hacer dataframe con varias dimensiones que son distintas y llenar N. Con eso puedes utilizar tidy R. Dependiendo de cómo lo estés juntando. Póngase si utiliza gather en la ayuda de cada una de estas funciones de tidy R. Usted puede ver que dice fill. No, no gather. Es separado. Es spread. Por ejemplo, spread, tiene fill. Si usted quiere llenarlo con algo específico puede cambiarle ese valor. Fill, separate y otras funciones de tidy R tienen ese valor.
Ok, yo pienso que sí, que ya cubrí las preguntas que puedo contestar hoy y ya llegamos a la hora. Les quiero agradecer otra vez por su atención, por sus preguntas. Espero que este webinar haya sido de satisfacción y que les haya algo nuevo que puedan utilizar en sus tareas diarias. Así que vamos a parar la presentación y gracias otra vez. Que tengan un feliz día.


