

Buenas tardes,

He construido la función “myfun” al objeto de considerar aquellas
persones que a partir de una determinada fecha de Apertura tienen como mínimo 65 años. Se tiene su fecha de
nacimiento, su fecha de inicio en la institución y su fecha de salida de la
misma. Doy vueltas al script y no acabo se saber cómo poder aplicar de un modo
eficiente las instrucciones “if” ó bien “ifelse”, y me dirijo al foro por si
alguien puede darme alguna idea. El script actualmente ya funciona (adjunto un
ejemplo), pero por lo que voy aprendiendo del foro,  intuyo que la programación es mejorable, pues básicamente el script hace casi todo el rato lo mismo.

Si además, alguien determina alguna otra parte mejorable, lo agradeceré mucho. Muchas gracias! 

DF <- data.frame(id=1:5,

               fnacim=as.Date(c("1939-10-28","1943-02-26","1946-03-09","1947-05-19","1932-04-03")),

               finicio=as.Date(c("2012-01-01","1980-07-15","1998-10-28","2011-10-28","2010-10-28")),

               fsal=as.Date(c("2012-05-01","2014-02-01","2012-10-20","2013-10-15","2012-08-25")))

 

myfun <-
function(data, edad_u=65, Apertura=as.Date("2010-01-01")) {

                

   ###  1 ) Si "finicio" es ANTERIOR O
IGUAL a la fecha de Apertura  ###

      dd1
<- data[data$finicio <= Apertura,]

 

   # Variable temporal: Edad en la fecha de
apertura

   dd1$edad_Apertura <-
unclass(round(difftime(Apertura, dd1$fnacim, units="auto")/365.25,1))

 

   # De estos individuos, identifico a aquellos
CUYA EDAD EN FECHA DE APERTURA ES

   #
INFERIOR O IGUAL A LOS 65 AÑOS, y añado las variables "edad_fent" y "fent"

   menor_t_Apertura <- dd1[dd1$edad_Apertura
<= edad_u,]

   

   menor_t_Apertura$edad_fent <- edad_u

 

   tmp.1 <- as.POSIXlt(menor_t_Apertura$fnacim)

   tmp.1$year <- tmp.1$year+65 

   menor_t_Apertura$fent <- as.Date(tmp.1) 

 

   # Individuos CUYA EDAD EN FECHA DE APERTURA ES
SUPERIOR A LOS 65 AÑOS

   mayor_t_Apertura <- dd1[dd1$edad_Apertura
> edad_u,]

   mayor_t_Apertura$edad_fent <-
unclass(round(difftime(Apertura, mayor_t_Apertura$fnacim, 

   units="auto")/365.25,1))

   mayor_t_Apertura$fent <- Apertura

 

   dd1.new
<- rbind(menor_t_Apertura, mayor_t_Apertura)

   dd1.new <- dd1.new[,-which(names(dd1.new)
%in% c('edad_Apertura'))]

 

  ###  2) Si 
"finicio" es POSTERIOR a la fecha de Apertura  ###

    dd2 <- data[ data$finicio >
Apertura,]  ; dd2$edad_fent <- NA ;  dd2$fent <- NA

 

 #####  Resultado  #####

  union <- rbind(dd1.new, dd2) ;  union <- union[with(union, order(id)), ] ;  return(union)

 

}  # FINAL DE LA FUNCIÓN

 

myfun(DF)

 		 	   		  
	[[alternative HTML version deleted]]

