Trucos R. Función ddply del paquete plyr
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 en su sintaxis, para eso está la ayuda. Creamos un data.frame con datos inventados que tendrá duplicados por id_cliente :
[source language=»R»]
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
saldosid_cliente=rpois(100,10000)+rpois(100,9000)
#Asignamos edad a los id_cliente
edad=data.frame(cbind(unique(saldosid_cliente),
(rpois(length(unique(saldos$id_cliente)),40))))
names(edad)=c(“id_cliente”,“edad”)
#Nos evitamos una incongruencia de cliente con distinta edad
saldos=merge(saldos,edad,by.x=“id_cliente”,by.y=“id_cliente”)
[/source]
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:
[source language=»R»]
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;’)[/source]
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:
[source language=»R»]
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))[/source]
¡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.