Ir al contenido principal

Tutorial sobre la familia Apply de R

En este tutorial aprenderás a usar las funciones apply en R, sus variantes y algunas funciones relacionadas aplicadas a distintas estructuras de datos.
Actualizado 17 sept 2026  · 14 min leer

Explorar con IA

ChatGPTClaudePerplexity

banner aprende r

Una nota sobre la familia Apply de R

La familia Apply de R es un conjunto de funciones en R que permiten aplicar una función a los elementos de un vector, lista o matriz. Sin embargo, se considera funcionalidad heredada y no debería usarse en código nuevo. En su lugar, se recomienda utilizar el paquete purrr para todos los bucles en R. El paquete purrr ofrece una sintaxis coherente para trabajar con funciones que aceptan múltiples entradas y salidas, lo que facilita escribir y leer código. Además, purrr incluye un conjunto de funciones optimizadas para entornos de computación modernos, por lo que suele ser más rápido y eficiente que la familia Apply. En resumen, aunque la familia Apply de R puede seguir funcionando para algunos casos, lo aconsejable es usar purrr en todos los proyectos nuevos de R.

Las funciones Apply como alternativa a los bucles

En este post verás cómo usar la función de R apply(), sus variantes como mapply() y algunos de los parientes de apply(), aplicadas a distintas estructuras de datos. Por supuesto, no se pueden cubrir todas las variantes, pero siempre que sea posible, se mostrará cómo combinarlas mediante un par de ejemplos algo más elaborados.

Además, puede que te resulte útil echar un vistazo a este curso de introducción a R para comprender mejor listas, vectores, arrays y data frames, aunque no es necesario completarlo para seguir este post.

La familia de apply()

La familia apply() pertenece al paquete base de R y reúne funciones para manipular segmentos de datos de matrices, arrays, listas y data frames de forma repetitiva. Estas funciones permiten recorrer los datos de varias maneras y evitan el uso explícito de bucles. Actúan sobre una lista, matriz o array de entrada y aplican una función indicada con uno o varios argumentos opcionales.

La función llamada puede ser:

  • Una función de agregación, como la media o la suma (que devuelven un número o escalar);
  • Otras funciones de transformación o de subconjunto; y
  • Otras funciones vectorizadas, que generan estructuras más complejas como listas, vectores, matrices y arrays.

Las funciones apply() son la base de combinaciones más complejas y ayudan a realizar operaciones con muy pocas líneas de código. En concreto, la familia está compuesta por las funciones apply(), lapply(), sapply(), vapply(), mapply(), rapply() y tapply().

Pero, ¿cómo y cuándo deberíamos usarlas?

Pues depende de la estructura de los datos sobre los que quieras operar y del formato de salida que necesites.

Cómo usar apply() en R

Empecemos por el patriarca de la familia, apply(), que opera sobre arrays. Para simplificar, este tutorial se limita a arrays 2D, también conocidos como matrices.

El manual base de R indica que se llama así: apply(X, MARGIN, FUN, ...)

donde:

  • X es un array o una matriz si la dimensión del array es 2;
  • MARGIN es una variable que define cómo se aplica la función: cuando MARGIN=1, se aplica por filas, mientras que con MARGIN=2, funciona por columnas. Ten en cuenta que si usas MARGIN=c(1,2), se aplica tanto a filas como a columnas; y
  • FUN es la función que quieres aplicar a los datos. Puede ser cualquier función de R, incluida una función definida por el usuario (UDF).

A quienes empiezan puede costarles visualizar qué ocurre, así que una imagen y algo de código vienen de perlas para aclararlo.

Construyamos una matriz de 5 x 6 e imaginemos que quieres sumar los valores de cada columna.

Puedes escribir algo así:

# Construct a 5 x 6 matrix
my_matrix <- matrix(1:30, nrow = 5, ncol = 6)

# Calculate the sum of each column
col_sums <- apply(my_matrix, 2, sum)

# Print the result
print(col_sums)

La función matrix() crea una matriz de 5 x 6 con valores del 1 al 30. Después usamos la función apply() para aplicar sum() a cada columna de la matriz (2 indica que queremos aplicar la función por columnas). El vector resultante con las sumas de las columnas se guarda en la variable col_sums y se imprime en consola.

Recuerda que, en R, una matriz puede verse como una colección de vectores fila si la recorres de arriba abajo (a lo largo del margen 1), o como una lista de vectores columna si la recorres de izquierda a derecha (a lo largo del margen 2).

Esto significa que la instrucción que acabas de ejecutar, representada en la figura 1, se traduce como: «aplica la función ‘sum’ a la matriz X a lo largo del margen 2 (por columnas), sumando los valores de cada columna».

Para no recargar la imagen, solo se resalta una de las columnas.

Obtienes un vector fila con las sumas de los valores de cada columna.

La salida del código anterior, un vector fila, también la obtendrías si sumaras por filas. Así es como R muestra el resultado.

Una nota para lo que sigue: en la mayoría de los casos, R puede devolver un valor aunque este no se haya especificado, o más exactamente, aunque el valor devuelto por la función no se haya asignado a una variable. R simplemente devuelve el último objeto evaluado. En la práctica, sin embargo, cuando quieres comprobar el valor devuelto y seguir operando con él, es mejor asignar explícitamente los resultados de una función a una variable.

La función lapply()

Quieres aplicar una función a cada elemento de una lista y obtener como resultado otra lista. Al ejecutar ?lapply, verás que la sintaxis se parece a la de apply().

La diferencia es que:

  1. Se puede usar con otros objetos como data frames, listas o vectores; y
  2. La salida es una lista (de ahí la «l» del nombre), con el mismo número de elementos que el objeto de entrada.

Para ver cómo funciona, crea unas cuantas matrices y extrae de cada una una columna concreta.

Esta es una operación bastante habitual con datos reales al comparar o agregar información de distintos data frames.

Nuestro ejemplo sencillo, representado en la figura 2, se puede codificar así:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgbGlzdCBvZiBtYXRyaWNlc1xuTXlMaXN0IDwtIGxpc3QoQSxCLEMpXG5cbiMgRXh0cmFjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGBNeUxpc3RgIHdpdGggdGhlIHNlbGVjdGlvbiBvcGVyYXRvciBgW2Agd2l0aCBgbGFwcGx5KClgXG4uLi4uLi4oTXlMaXN0LFwiW1wiLCAsIDIpXG5cbiMgRXh0cmFjdCB0aGUgMXN0IHJvdyBmcm9tIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCApIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIGxpc3Qgb2YgbWF0cmljZXNcbk15TGlzdCA8LSBsaXN0KEEsQixDKVxuXG4jIEV4dHJhY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBgTXlMaXN0YCB3aXRoIHRoZSBzZWxlY3Rpb24gb3BlcmF0b3IgYFtgIHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgLCAyKVxuXG4jIEV4dHJhY3QgdGhlIDFzdCByb3cgZnJvbSBgTXlMaXN0YFxubGFwcGx5KE15TGlzdCxcIltcIiwgMSwgKSIsInNjdCI6InRlc3Rfb2JqZWN0KFwiTXlMaXN0XCIpXG50ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIsIGluZGV4ID0gMSlcbnRlc3RfZnVuY3Rpb24oXCJsYXBwbHlcIiwgaW5kZXggPSAyKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

funciones lapply vs apply

La operación se muestra en la parte izquierda de la figura 2.

De nuevo, empiezas indicando el objeto de interés, la lista Mylist. Usas el operador de selección estándar de R [ y omites el primer parámetro (que se interpreta como «cualquiera», por eso ves dos comas).

Luego especificas el segundo parámetro, que es 2: nuestro margen es «columna». Así extraes la segunda columna de todas las matrices dentro de la lista.

Algunas notas sobre el código anterior:

  • La notación [ es el operador de selección. Recuerda, por ejemplo, que para extraer todos los elementos de la tercera fila de B necesitas: B[3,];
  • La notación [[ ]] indica que tratamos con listas: [[2]] significa el segundo elemento de la lista. Esto también aparece en la salida de R;
  • La salida es una lista con tantos elementos como el objeto de entrada; y
  • También podrías haber extraído un único elemento de cada matriz, así: lapply(MyList,"[", 1, 2)

En la parte derecha de la figura 2, ves una extracción alternativa: esta vez omites el primer parámetro y obtienes la primera fila de cada matriz.

¡Pruébalo tú! Selecciona la segunda columna de cada matriz de la lista:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBVc2UgYGxhcHBseSgpYCB0byBzZWxlY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBlYWNoIG1hdHJpeCBpbiBgTXlMaXN0YFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMSwpIiwic29sdXRpb24iOiIjIFVzZSBgbGFwcGx5KClgIHRvIHNlbGVjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGVhY2ggbWF0cml4IGluIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIpXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9

La función sapply()

La función sapply() funciona como lapply(), pero intenta simplificar la salida a la estructura de datos más elemental posible. De hecho, sapply() es un «wrapper» de lapply().

Un ejemplo ayuda a entenderlo: supón que quieres repetir la extracción de un único elemento como en el ejemplo anterior, pero ahora tomar el primer elemento de la segunda fila (índices 2 y 1) de cada matriz.

Aplicar lapply() nos devolvería una lista, a menos que pases simplify=FALSE como parámetro a sapply(). En ese caso, se devolverá una lista. Mira cómo funciona en el siguiente bloque de código:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBSZXR1cm4gYSBsaXN0IHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHNhcHBseSgpYFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBzYXBwbHkoKWBcbi4uLi4uLihNeUxpc3QsXCJbXCIsIDIsIDEsIHNpbXBsaWZ5PUYpXG5cbiMgUmV0dXJuIGEgd mVjdG9yIHdpdGggYHVubGlzdCgpYFxuLi4uLi4uKGxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKSkiLCJzb2x1dGlvbiI6IiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBsYXBwbHkoKWBcbmxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGBzYXBwbHkoKWBcbnNhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIGxpc3Qgd2l0aCBgc2FwcGx5KClgXG5zYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxLCBzaW1wbGlmeT1GKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGB1bmxpc3QoKWBcbnVubGlzdChsYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxICkpIiwic2N0IjoidGVzdF9mdW5jdGlvbihcImxhcHBseVwiKVxudGVzdF9mdW5jdGlvbihcInNhcHBseVwiLCBpbmRleCA9IDEpXG50ZXN0X2Z1bmN0aW9uKFwic2FwcGx5XCIsIGluZGV4PSAyKVxudGVzdF9mdW5jdGlvbihcInVubGlzdFwiLCBcInhcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

A la inversa, una función como unlist() puede indicarle a lapply() que te devuelva un vector.

En cualquier caso, para evitar confusiones, lo mejor es usar estas funciones en su «formato nativo» y evitar conversiones salvo que sean estrictamente necesarias.

La función rep()

Algo que suele usarse junto con las funciones apply() es rep(). Al aplicarla a un vector o factor x, la función replica sus valores el número de veces que indiques.

Usemos uno de los vectores que generaste arriba con lapply() dentro de MyList.

Esta vez, sin embargo, seleccionas solo los elementos de la primera fila y primera columna de cada elemento de la lista MyList (y usas sapply() para obtener un vector):

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGBaYFxuWiA8LSBzYXBwbHkoTXlMaXN0LFwiW1wiLCAxLDEgKVxuXG4jIFJldHVybiBgWmBcblpcblxuIyBSZXBsaWNhdGUgdGhlIHZhbHVlcyBvZiBgWmBcblogPC0gcmVwKFosYygzLDEsMikpXG5cbiMgUmV0dXJuIGBaYFxuWiJ9

Ves que el código anterior replica los valores de Z tantas veces como indica c(3,1,2): tres veces el primero, una vez el segundo y dos veces el tercero.

Práctico, ¿verdad?

La función mapply()

La función mapply() significa «apply multivariante». Su objetivo es vectorizar los argumentos de una función que normalmente no acepta vectores como argumentos.

En pocas palabras, mapply() aplica una función a múltiples argumentos de lista o múltiples argumentos vectoriales.

Veamos un ejemplo de mapply() en el que creas una matriz de 4 x 4 con llamadas repetidas a la función rep():

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDR4NCBtYXRyaXhcblExIDwtIC4uLi4uLihjKHJlcCgxLCA0KSwgcmVwKDIsIDQpLCByZXAoMywgNCksIHJlcCg0LCA0KSksNCw0KVxuXG4jIFByaW50IGBRMWBcbi4uLi4uKFExKVxuXG4jIE9yIHVzZSBgbWFwcGx5KClgXG5RMiA8LSAuLi4uLi4ocmVwLDE6NCw0KVxuXG4jIFByaW50IGBRMmBcbnByaW50KFEyKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgYSA0eDQgbWF0cml4XG5RMSA8LSBtYXRyaXgoYyhyZXAoMSwgNCksIHJlcCgyLCA0KSwgcmVwKDMsIDQpLCByZXAoNCwgNCkpLDQsNClcblxuIyBQcmludCBgUTFgXG5wcmludChRMSlcblxuIyBPciB1c2UgYG1hcHBseSgpYFxuUTIgPC0gbWFwcGx5KHJlcCwxOjQsNClcblxuIyBQcmludCBgUTJgXG5wcmludChRMikiLCJzY3QiOiJ0ZXN0X29iamVjdChcIlExXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWF0cml4KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hdHJpeCgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MSwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgYWRkIGBwcmludCgpYCB0byB0aGUgY29kZT9cIiwgdW5kZWZpbmVkX21zZz1cIkRpZCB5b3UgZm9yZ2V0IHRvIGFkZCBgcHJpbnQoKWAgdG8gdGhlIGNvZGU/XCIpXG50ZXN0X29iamVjdChcIlEyXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWFwcGx5KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hcHBseSgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MikifQ==

Pero verás que hay una forma más eficiente de concatenar los resultados de rep() que con c(): al llamar a mapply(), vectorizas la acción de la función rep().

La función aggregate()

Esta función está en el paquete stats, y se usa así: aggregate(x, by, FUN, ..., simplify = TRUE).

En otras palabras, funciona de forma similar a apply(): especificas el objeto, la función y si quieres simplificar, como con sapply(). La diferencia clave es la cláusula by, que establece la variable o el campo del data frame por el que quieres agrupar para realizar la agregación.

En la siguiente sección verás cómo funciona.

Un ejemplo de aggregate()

Considera el conjunto de datos de ejemplo llamado Mydf, que contiene datos sobre las ventas de un producto y en el que algunos valores de la columna DepPC se repiten.

Esta variable clasifica los datos por ubicación geográfica, como la parte de un código postal (aquí los números corresponden a los departamentos de Île-de-France, la región que incluye París).

Quieres hacer algo de estadística sobre las columnas de ventas. Estas son DProgr, un número progresivo en orden temporal creciente, y las ventas del producto (la cantidad Qty), además de una variable lógica, Delivered, que indica si el producto se entregó (T) o no (F).

Primero, puedes hacer varias cosas sencillas para familiarizarte con el dataset, además de mostrarlo entero escribiendo su nombre (aquí solo hay 120 registros, pero imagina hacerlo con un fichero real de miles de líneas).

Exploremos los datos:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG4uLi4uKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG4uLi4uKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbi4uLihNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzb2x1dGlvbiI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG5oZWFkKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG50YWlsKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbmRpbShNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwiaGVhZFwiKVxudGVzdF9mdW5jdGlvbihcInRhaWxcIilcbnRlc3RfZnVuY3Rpb24oXCJzYXBwbHlcIilcbnRlc3RfZnVuY3Rpb24oXCJkaW1cIilcbnRlc3RfZnVuY3Rpb24oXCJ1bmlxdWVcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Nota: si quieres ver el número de filas y columnas del data frame, también puedes llamar a nrow(Mydf) y ncol(Mydf).

Se pueden hacer muchas más consultas sobre los datos.

Aquí te interesa saber en qué departamento se vende mejor el producto. Por eso agruparás los datos por departamento, sumando las ventas, Qty, de cada departamento DepPC con ayuda de aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6ImFnZ3JlZ2F0ZShNeWRmJFF0eSwgYnk9TXlkZltcIkRlcFBDXCJdLCBGVU49c3VtKSJ9

Así, aggregate() le indica a R que quieres sumar todos los Qty que pertenecen al mismo departamento.

Observa que R asignó la suma a una variable «x» porque no indicaste otra cosa.

La salida es bastante legible tal cual, pero con muchos departamentos puede resultar menos clara. En esos casos, puedes recurrir a una salida gráfica: representa los resultados con uno de los sistemas gráficos de R junto con aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IHRoZSBzYWxlcyBwZXIgZGVwYXJ0bWVudFxuZ2dwbG90KGRhdGE9YWdncmVnYXRlKE15ZGYkUXR5LGJ5PU15ZGZbXCJEZXBQQ1wiXSxGVU49c3VtKSwgYWVzKHg9RGVwUEMsIHk9eCkpICtcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3RpdGxlKFwiU2FsZXMgcGVyIGRlcGFydG1lbnQgLSBBbGxcIikifQ==

Esto nos da las ventas por departamento.

Puedes hacerte la misma pregunta, pero solo para los artículos entregados. Para ello, primero crea un subconjunto con los datos donde delivered sea verdadero (T) usando el ya familiar operador de subconjunto "[".

Nota: aquí asignas el resultado a una nueva variable Y, que es un nuevo data frame que hereda los mismos nombres de columnas del data frame padre Mydf. Lo haces para no repetir la instrucción de agregación dentro de la llamada al gráfico y así mejorar la legibilidad:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKVxubGlicmFyeShnZ3Bsb3QyKSIsInNhbXBsZSI6IiMgc2VsZWN0IG9ubHkgZm9yIGRlbGl2ZXJlZD1UcnVlXG5ZIDwtIE15ZGZbTXlkZiREZWxpdmVyZWQ9PVRSVUUsXVxuXG4jIFBsb3QgdGhlIHNhbGVzIGJ5IGRlcGFydG1lbnRcbmdncGxvdChkYXRhPWFnZ3JlZ2F0ZShZJFF0eSxieT1ZW1wiRGVwUENcIl0sRlVOPXN1bSksIGFlcyh4PURlcFBDLCB5PXgpKSArXG4gIGdlb21fcG9pbnQoKStcbiAgZ2d0aXRsZShcIlNhbGVzIHBlciBkZXBhcnRtZW50IC0gRGVsaXZlcmVkXCIpIn0=

Como ves, puedes plantear diferentes preguntas a los datos de forma vectorizada como con aggregate(), y a menudo lo harás en combinación con un sistema de gráficos cómodo como ggplot2. La idea se entiende.

Y fíjate: para conseguirlo solo has necesitado muy pocas líneas de código.

¿Vectorización como alternativa a los bucles y a las funciones Apply?

Has visto variaciones sobre el mismo tema: «actuar sobre un conjunto de datos estructurado de forma repetitiva». En este sentido, estas funciones pueden verse no solo como alternativa a los bucles, sino también como una forma vectorizada de hacer las cosas.

«Vectorizada» aquí en sentido amplio; no entraremos en el debate sobre si –y cuáles de– las funciones apply() están realmente vectorizadas (puedes ver, por ejemplo, la discusión aquí).

En la práctica, para elegir qué función apply() usar, conviene tener en cuenta lo siguiente:

  • El tipo de dato de la entrada: el objeto sobre el que actuarás (vector, matriz, array…, lista, data frame o quizá una combinación)
  • Qué pretendes hacer: la función FUN que vas a pasar
  • Los subconjuntos de esos datos: ¿filas, columnas o todo?
  • Qué tipo de dato quieres obtener de la función, porque quizá quieras seguir operando con él (¿quieres un objeto nuevo o transformar directamente el objeto de entrada?).

Estas son preguntas bastante generales que también puedes plantearte para las funciones relacionadas, como aggregate(), by(), sweep(), etc.

¡Pero hay muchas más! ¡No dejes de explorar! Echa un vistazo al tutorial de DataCamp Arrays in R.

Como continuación de este tutorial, plantéate hacer los cursos de DataCamp Introduction to R o Intermediate R.

Temas
R
Ciencia de datos

Aprende más sobre R

Curso

Introducción a R

4 h
3.1M
Domina los fundamentos del análisis de datos en R, como vectores, listas y marcos de datos, y practica R con conjuntos de datos reales.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

Tutorial sobre el uso de funciones en R

Descubra qué son las funciones R, los diferentes tipos de funciones en R y cómo crear sus propias funciones en R.
Javier Canales Luna's photo

Javier Canales Luna

11 min

Tutorial

Tutorial de regresión lineal en R

En este tutorial aprenderás los fundamentos de un modelo estadístico muy popular: la regresión lineal.

Eladio Montero Porras

15 min

Tutorial

Tutorial de Subconjuntos en R

Descubre cómo acceder a los datos de tu marco de datos con el subconjunto. Aprende a hacer subconjuntos utilizando paréntesis o la función subconjunto() de R.
DataCamp Team's photo

DataCamp Team

4 min

Tutorial

A Loops in R Tutorial - Uso y Alternativas

Un tutorial sobre bucles en R que examina las construcciones disponibles en R para realizar bucles. Descubra alternativas utilizando la función de vectorización de R.
Carlo Fanara's photo

Carlo Fanara

32 min

multiple linear regression

Tutorial

Regresión lineal múltiple en R: tutorial con ejemplos

Una visión completa para entender las regresiones lineales múltiples en R a través de ejemplos.
Zoumana Keita 's photo

Zoumana Keita

12 min

Tutorial

Tutorial de tablas de contingencia en R

En este tutorial, aprenderás a crear tablas de contingencia y a probar y cuantificar las relaciones visibles en ellas.
Łukasz Deryło's photo

Łukasz Deryło

10 min

Ver MásVer Más