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.
?y si tuvieras otra variable ademas de edad para segmentar o agrupar la informacion y quisieras que te quedaran los elementos de esa variable como podria ser «localizacion geografica» en diferentes columnas, como lo lograrias con ddply o sqldf?
Saludos
Hola, prueba con xtabs aquí tienes un ejemplo de uso: https://analisisydecision.es/informes-con-r-en-html-comienzo-con-r2html-i/
Para agrupar variables como lo hace aggregate, creo que puedes poner en lugar de «edad» c(variable1, variable2), hice una prueba y me funcionó bien.
Saludos.