Volver al código R

Ventas, margen y participación por categoría en seis líneas

Con R base y sin paquetes: sumar por categoría, calcular margen y participación, y ordenar de mayor a menor.

El problema

Te pasan las ventas del mes y la pregunta de siempre: qué categoría vende más, cuál deja más margen y cuánto pesa cada una. No hace falta instalar nada para contestar.

R
ventas <- data.frame(
  categoria = c("Bebidas", "Snacks", "Bebidas", "Limpieza", "Snacks", "Bebidas"),
  monto     = c(120.5, 80, 210.25, 150, 45.75, 99),
  costo     = c(70, 52, 130, 110, 30, 61)
)

resumen <- aggregate(cbind(monto, costo) ~ categoria, data = ventas, FUN = sum)
resumen$margen_pct <- round((resumen$monto - resumen$costo) / resumen$monto * 100, 1)
resumen$participacion <- round(resumen$monto / sum(resumen$monto) * 100, 1)
resumen <- resumen[order(-resumen$monto), ]

print(resumen, row.names = FALSE)

Por qué está escrito así

  1. aggregate con la fórmula cbind(monto, costo) ~ categoria suma las dos columnas por cada categoría de una vez.
  2. Las operaciones son vectorizadas: el margen de todas las categorías se calcula en una línea, sin bucle.
  3. order con el signo menos ordena de mayor a menor.
  4. Todo es R base: corre en cualquier instalación, sin tidyverse.
Cómo probarlo

Guardalo como resumen.R y corré: Rscript resumen.R. Para tus datos, reemplazá el data.frame por read.csv("ventas.csv").

Ojo con esto

aggregate descarta en silencio las filas con NA en cualquiera de las columnas. Si tu archivo tiene vacíos, el total va a dar menos sin avisar: revisá con summary(ventas) antes.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo este resumen de ventas por categoría en R base. Mis datos reales están en [ARCHIVO] con estas columnas: [COLUMNAS]. Adaptalo para leer el archivo, tratar los valores vacíos de forma explícita (decime cuántas filas quedan afuera y por qué), agregar la comparación contra [PERÍODO ANTERIOR] y exportar el resultado a CSV. Sin paquetes externos salvo que sea imprescindible, y decime cuál.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.