Archivo de la etiqueta: recode

Trabajando con factores en R. Attach frente a within

Un ejemplo de trabajo con datos en R. Transformamos factores de dos formas distintas. Por un lado empleamos within con recode de la librería car y por otro lado empleamos el mítico attach.

Manejo de datos con within:

datos library(car)
datos prog id reconocimientos reconocimientos2 = recode(num_awards,"0='Sin renococimiento';1='1 reconocimiento';
else='Más de un reconocimiento'")
})

Manejo de datos con attach/detach:

attach(datos)
datos$math_cat[math < 50 ] <- "D" datos$math_cat[math >= 50 & math < 60] <- "C" datos$math_cat[math >= 60 & math < 75] <- "B" datos$math_cat[math >= 75] <- "A"
datos$math_cat detach(datos)

No voy a entrar en que es más óptimo, tarda menos y demás. En mi opinión es mejor utilizar within pacece más "pulcro" y la verdad es que la función recode nos facilita mucho el trabajo pero como siempre tenemos múltiples posibilidades con R, por eso es R. Saludos.

Informes con R en HTML. Comienzo con R2HTML (I)

En las III jornadas de R tuve el placer de asistir al taller de Gregorio Serrano sobre informes con R. Me abrió los ojos. Siempre he pensado que R no es una herramienta que sirva para hacer informes [modo consultor = ON] R no servía para realizar reporting  [modo consultor = OFF]. Pero R tiene un poderoso motor gráfico y dispone del paquete R2HTML para poder realizar tablas en HTML y si trabajamos con libros CSS de estilos podemos obtener resultados muy atractivos. Así que la otra tarde me puse manos a la obra y creo que puede salir una trilogía interesante. Bueno, depende del interés que despierte esta entrada del blog haré más entregas, pero de momento tengo en mente llegar a 3.

Seguimos con el sistema habitual. Simulo unos datos de ejemplo que podéis copiar  y pegar en vuestra consola de R:

clientes=20000
saldo_vista=abs(rnorm(clientes,0,1)*10000+5000)
saldo_ppi=(runif(clientes,0.1,0.6)*rpois(clientes,2))*60000
saldo_fondos=abs(rnorm(clientes,0,1)*100000+3000)*(runif(clientes)>=0.6)
edad=rpois(clientes,60)
datos_ini<-data.frame(cbind(saldo_vista,saldo_ppi,saldo_fondos,edad))
datos_ini$saldo_ppi=(edad<65)*datos_ini$saldo_ppi
#Creamos la variable objetivo a partir de un potencial
datos_ini$potencial= runif(clientes,0,1)
datos_ini$potencial= datos_ini$potencial +
log(edad)/2 +
runif(1,0,0.03)*(saldo_vista>20000)+
runif(1,0,0.09)*(saldo_fondos>30000)+
runif(1,0,0.07)*(saldo_ppi>10000)
datos_ini$pvi=(datos_ini$potencial>=quantile(datos_ini$potencial,
0.85))*1
#Eliminamos la columna que genera nuestra variable dependiente
datos_ini = subset(datos_ini, select = -c(potencial))

Datos simulados de una entidad bancaria donde tenemos edad, saldos en distintos productos de pasivo e identificamos a aquellos clientes que tienen contratada una pensión vitalicia. Nos solicitan realizar un informe con los datos de contratación por edad y por pasivo. Cuando realizamos informes es muy habitual tramificar variables continuas. Para crear los tramos de edad y de pasivo vamos a emplear Sigue leyendo Informes con R en HTML. Comienzo con R2HTML (I)

Gráficos de barras y líneas en dos ejes con R

grafico_actuarial_r.png

Aunque no es recomendable crear gráficos con 2 ejes hoy quería mostraros un gráfico muy común realizado con R. Se trata del gráfico de barras y líneas para un factor. Las barras serán un valor de exposición del factor y las líneas pueden ser una  frecuencia siniestral y estarán en un eje secundario. Con esto crearemos nuestro gráfico de barras y líneas en dos ejes. Simulamos los datos para crear el gráfico con R:

#Numeros aleatorios de con una distribución gamma
potencia = ceiling(rgamma(1000, shape = 10, rate = 0.08))
hist(potencia)

Generamos números aleatorio con una distribución gamma con la función rgamma que asemejan a la potencia de los vehículos en caballos que se venden actualmente en el mercado español. Ahora tenemos que codificar esta potencia en un factor, para ello tenemos Sigue leyendo Gráficos de barras y líneas en dos ejes con R

Recodificar el valor de un factor en R

Tras leer una duda planteada en la lista de R-Help en español me he animado a crear una entrada acerca de la recodificación de factores en R. Así dejo recogido algún código/truco que puede serviros en vuestro trabajo con R y que este pequeño problema no afecte a vuestra productividad. Además os acerco a la función recode del paquete car. Pero en primer lugar os planteo como recodificar factores empleando IF/ELSE:


#Datos de ejemplo:
dt = rpois(200,3)
#Empleamos el bucle for
for (i in 1:length(dt)){
if (dt[i]<=1) {dt0[i]='Tipo 1'} else
if (dt[i]==2) {dt0[i]='Tipo 2'} else
if (dt[i]==3) {dt0[i]='Tipo 3'} else
{dt0[i]='Tipo 4'}}
table(dt0)

Realizamos un bucle FOR con R que recoge el objeto dt que hace de ejemplo. Este sería el método más habitual junto con el uso de la función ifelse. Pero el paquete car contiene una función muy interesante y que nos permite ahorrar complicaciones y líneas de código:

library(car)
dt1 = recode(dt,"c(0,1)='Tipo 1';2='Tipo 2';3='Tipo 3';else='Tipo 4'")
table(dt1)

Fácil de recordar. Podemos recodificar un factor (NA=0), un vector (c(0,1)='Tipo 1') o un rango de valores (4:max(dt)='Tipo 4). Bajo mi punto de vista es la opción más recomendable cuando queremos reagrupar factores. También tenemos la función as.item del paquete memisc, no estoy acostumbrado a usarla pero os planteo el mismo ejemplo con ella:

library(memisc)
dt2 = as.item(dt,labels=c( 'Tipo 1'=0, 'Tipo 1'=1, 'Tipo 2'=2, 'Tipo 3'=3,
'Tipo 4'=4, 'Tipo 4'=5,'Tipo 4'=6,'Tipo 4'=7,'Tipo 4'=8,'Tipo 4'=9,'Tipo 4'=10))
table(dt2)
summary(dt2)

Tras ejecutar el código entenderéis porque no la uso. Espero que haya respuestas a esta entrada con otras posibilidades o que alguien me justifique el empleo del as.item, saludos.