Estimado Francisco Javier

Mi respuesta en una obervación y un comentario.

La observación: su código anda, creo que sin problemas (no verifiqué las 
fechas), pero hace una diferencia en los <NA> para fent y edad_fent 
donde usa NA.

copio y pego lo que da en mi consola:

>myfun(DF)
   id     fnacim    finicio       fsal edad_fent       fent
1  1 1939-10-28 2012-01-01 2012-05-01        NA       <NA>


El comentario: yo en un trabajo realicé algo semejante, ¿usted tiene 
problemas de rendimiento con sus datos reales?. Porque mi forma de 
pensar es: funciona y no hay problemas de rendimiento ==> no tocar

Hay otras formas para trabajar con fechas, se podría utilizar otra 
programación, ver cuál es la más eficiente, pero ¿necesita mejorar el 
rendimiento o es mejor usar ese tiempo en otras actividades?

Si usted tiene problemas de rendimiento, yo no tengo inconvenientes en 
buscar el código que usé en mis actividades, pero de pronto es un 
trabajo incesesario, salvo para practivar, aprender, por curiocidad, o 
algún otro motivo muy respetable.

Pienso en dos cosas, el tiempo para mantener algo que uno no penso 
(escrito por otro), el tiempo para aprender otra forma de hacer las cosas.

Pero también es un buen ejemplo para abrir en la lista un intercambio de 
ideas sobre distintas formas de trabajar con fechas, lo cuál puede ser 
bueno para aprender entre muchos.

Javier Marcuzzi

El 21/07/2014 03:42 p.m., Francisco Javier escribió:
> 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]]

