[MUSIC] En esta lección aprenderemos a utilizar la familia de funciones apply. Éstas son una familia de funciones vectorizadas, que nos ayudarán a aplicar, como el nombre lo indica, algún tipo de función sobre los vectores o sobre los objetos para las cuales están diseñadas. Como you hemos sugerido en algunas otras ocasiones, las funciones vectorizadas son funciones en donde implÃcitamente se piensa que la operación se hace en paralelo. Una vez que hacemos ese tipo de operaciones en paralelo, podemos pensar entonces que tenemos una ganancia en el desempeño de la función. you que, si tuviéramos varios procesadores o varios "cores" en una sola máquina, este tipo de funciones toman ventaja de esa arquitectura. Éstas nos permiten cruzar los datos, de tal manera que no tengamos que utilizar bucles de manera explÃcita. Como son los For, los Whiles o los Repeats. Las funciones apply actúan sobre algún tipo de entrada. Éstas pueden ser listas, matrices o vectores. Además, que les aplican la función que entra también como un argumento opcional. La función más básica de las funciones apply es, justamente, la función apply. Ésta opera sobre rebanadas de los datos. Es decir, sobre subconjuntos de datos que nosotros you tenemos. Pueden ser rebanadas de un dataframe, o de una matriz, o incluso operar sobre vectores completos. Hay tres tipos de funciones que pueden entrar como argumento a la función apply. La primera, y es una de las más comunes, son las funciones de agregación. Estas pueden ser funciones que operan sobre un conjunto de datos y regresan un único valor. Por ejemplo, podemos decir la suma o la media. El segundo tipo puede ser una función de transformación o de extracción de subconjuntos. Como al alguno de los operadores que you hemos visto. you sea para acceder a Ãndices de un vector o una matriz, o también de una lista. El tercer tipo son funciones vectorizadas que pueden regresar estructuras más complejas, como listas, vectores o matrices. Estas funciones, las funciones apply, pueden formar la base de funciones aún más complejas pero, lo que tienen de bonito es que pueden expresar complejidad muy grande en unas cuantas lÃneas de cógido. Las tres opciones más importantes de la familia apply son Apply, sapply y lapply. Además de que tenemos otras más que no son más que variantes de estas tres básicas. Comenzaremos con la función apply. Ésta opera sobre arreglos, como pueden ser las matrices. Los tres parámetros más importantes de la función apply son: X, que es un vector un arreglo donde se va a operar. Margin, que es una variable que nos define si vamos a operar sobre renglones o columnas, y la función. Cuando usamos margin=1, significa que estamos operando sobre los renglones, y cuando usamos margin=2, significa que estamos operando sobre las columnas. Pero también podemos pasar como parámetro a un vector c 1, 2, que nos indicarÃa que estamos operando sobre renglones y columnas. Antes de continuar, me gustarÃa hablarles de la función set.seed(). Ésta lo que hace es que si establecemos todos el mismo valor inicial de la semilla, como lo indica su nombre, todos los números aleatorios que generemos después de utilizar esta función, tendrán el mismo valor en todas las computadoras. Si no hiciéramos esto, estarÃamos generando todos números aleatorios distintos, you que las semillas con las que se generan los números aleatorios, serÃan distintas en cada computadora que estuviéramos utilizando. En el ejemplo que está apareciendo en pantalla utilizamos la función set.seed con un parámetro igual a 100 para que, a partir de este momento, cuando utilicemos la función rnorm( ), que genera números aleatorios. Todos esos números, pseudoaleatorios en realidad, nos salgan iguales a todos al mismo tiempo, y pudieran reproducir este mismo ejemplo en sus computadoras. La función rnorm( ) lo que hace es nos regresa valores de una normal 0,1. Y como primer parámetro, es el número de valores de una normal 0,1 que queremos tener. En este caso, en nuestro ejemplo, estamos observando que estamos generando una matriz de valores pseudoaleatorios. De tamaño 5X6, es decir, cinco renglones, seis columnas. Ahora, supongamos que tenemos esa matriz, la llamamos x, entonces, si queremos encontrar la suma de cada columna, podemos utilizar la función apply, para encontrar esos valores de cada columna. La forma en como la aplicamos es utilizar la función apply(), el vector x como primer parámetro, el segundo es el parámetro margin, en este caso vamos a utlizar dos porque queremos operar la función suma sobre las columnas y, como tercer parámetro, la función suma. Asà podemos observar que nos regresa a utilizar la función de esa manera, que es la suma de cada una de esas columnas. Sólo para comprobar, podemos utilizar la función sum sobre la primera columna del vector X. Usando los operadores de extracción de subconjuntos, y podemos ver que coincide con el valor del primer elemento del vector que nos regresó a la función apply. Lo cual nos está diciendo que la suma está siendo correcta. Una vez que tengamos nuestra matriz x, podemos encontrar la suma columna por columna de esta matriz. Si aplicamos la función apply. La podemos aplicar de la siguiente manera. Primero utilizamos apply, ponemos como primer parámetro la matriz X, como segundo parámetro margin serÃa igual a dos. Ésto significa que va a operar columna a columna. Y como tercer parámetro la función sum. Asà nos regresarÃa a un vector donde cada uno de los valores o elementos de este vector va a ser la suma de cada una de las columnas. Este gráfico que estamos observando es sólo para recordarnos que, cuando utilizamos dos, quiere decir que estamos operando sobre las columnas, y, cuando utilizamos uno, estamos operando sobre los renglones. Si quisiéramos hacer esto paso por paso tendrÃamos que utilizar un ciclo for para ir iterando en cada una de las columnas y haciendo esta suma. Esto serÃa un poco complicado y alargarÃa mucho nuestro código. Es por eso que la función apply es muy útil en este caso. [MUSIC]