El paquete plyr de R tiene unas funciones que nos permiten hacer sumarizaciones de forma muy rápida y sencilla. Hoy quería trabajar con la función ddply(). Todos esos resúmenes y agregaciones que nos cuestan mucho código con la función ddply() pasan a ser de lo más sencillo. Al tajo, o mejor dicho, al ejemplo; como siempre, creo que ilustrar ddply() es mejor que entrar in su sintaxis, para eso está la ayuda. Creamos un data.frame con datos inventados que tendrá duplicados por id_cliente:

saldo1 <- runif(100, 0, 1) * 1000
saldo2 <- runif(100, 0, 0.5) * 10000
saldos <- data.frame(cbind(saldo1, saldo2))

# Voy a crear un id_cliente con duplicados
saldos$id_cliente <- rpois(100, 10000) + rpois(100, 9000)

# Asignamos edad a los id_cliente
id_unicos <- unique(saldos$id_cliente)
edad <- data.frame(id_cliente = id_unicos,
                   edad = rpois(length(id_unicos), 40))

# Nos evitamos una incongruencia de cliente con distinta edad
saldos <- merge(saldos, edad, by = "id_cliente")

Tabla de saldos con 100 registros y por cada cliente dos saldos y la edad. La idea es hacer una tabla agregada a nivel de edad; necesitamos identificar los clientes duplicados, calcular máximos, mínimos y medias. Hace tiempo ya hice referencia al paquete sqldf. Hasta conocer ddply() yo hacía:

library(sqldf)

sqldf('select edad,
       count(distinct id_cliente) as cli,
       count(id_cliente) as reg,
       max(saldo1) as max1,
       max(saldo2) as max2,
       avg(saldo1) as saldo1,
       avg(saldo2) as saldo2
       from saldos
       group by edad;')

No es un código complejo; como siempre he dicho, si sabes SQL sabes R. Pero un buen día me crucé con el paquete plyr y la función ddply():

library(plyr)

ddply(saldos, "edad", summarise,
      cli = length(unique(id_cliente)),
      reg = length(id_cliente),
      max1 = max(saldo1),
      max2 = max(saldo2),
      saldo1 = mean(saldo1),
      saldo2 = mean(saldo2))

¡Qué forma más sencilla y práctica de sumarizar datos con R! No negaréis que este código puede entenderlo hasta el novio de Falete. Una función simplemente genial. Saludos.