[R-br] RES: Operação entre datas

salah salah3.1416 em gmail.com
Sexta Junho 24 17:58:09 BRT 2016


Boa ideia Éder!

Considerando que se deseja apenas o cálculo dos anos

segue outra ideia

## data.frame
DADOS = data.frame(
         NASCIMENTO = c("26/11/97", NA, "14/05/99","06/05/98"),
         DATA_FATO  = c("23/02/15", "28/03/15", "08/04/15", "08/04/15"))

within(DADOS,
         {
             ## converter para Date
             NASCIMENTO = as.Date(NASCIMENTO, "%d/%m/%y")
             DATA_FATO = as.Date(DATA_FATO, "%d/%m/%y")
             IDADE = as.numeric(format(DATA_FATO, "%Y")) - 
as.numeric(format(NASCIMENTO, "%Y"))
             ## opcional
             ## modificando o formato de saida da data
             NASCIMENTO = format(NASCIMENTO, "%d/%m/%Y")
             DATA_FATO = format(DATA_FATO, "%d/%m/%Y")
         })##end within

saudações

Em 24/06/2016 09:41, Éder Comunello escreveu:
> Uma ideia...
>
> ### <code r>
> if(!require(eeptools)){install.packages("eeptools"); require(eeptools)}
>
> DADOS <- data.frame(
>   NASCIMENTO = c("26/11/97", "20/03/99", "14/05/99","06/05/98", 
> "03/01/00", "19/05/97", "01/02/01", "28/11/97", "10/02/00"),
>   DATA_FATO =  c("26/11/07", "20/04/09", "14/06/09","06/10/08", 
> "13/01/10", "29/05/07", "01/02/11", "28/11/07", "10/02/10"))
>
> DADOS$NASCIMENTO <- as.Date(DADOS$NASCIMENTO, "%d/%m/%y")
> DADOS$DATA_FATO  <- as.Date(DADOS$DATA_FATO,  "%d/%m/%y")
>
> DADOS$IDADE <-  round(age_calc(DADOS$NASCIMENTO, DADOS$DATA_FATO, 
> units = "years"), 2)
> DADOS
>
> # Os warnings são devidos à forma de implementação da função, que só 
> permite verificar a condição do primeiro elemento (enddate < dob)
> if (DADOS$DATA_FATO < DADOS$NASCIMENTO) {print("ok")}
>
> # A forma abaixo suprime os warnings por realizar o cálculo 
> "independente" de cada elemento
> sapply(1:9, function(x) round(age_calc(DADOS$NASCIMENTO[x], 
> DADOS$DATA_FATO[x], units = "years"), 2))
>
> ### simulando o erro...
> DADOS$NASCIMENTO[c(3,6,7)] <- NA
> DADOS$IDADE <- NA
> DADOS$IDADE <- round(age_calc(DADOS$NASCIMENTO, DADOS$DATA_FATO, units 
> = "years"), 2) # ERRO!
> # Error in seq.int <http://seq.int>(r1$year, to$year, by) :
> #   'from' cannot be NA, NaN or infinite
> # In addition: Warning message:
> #   In if (enddate < dob) { :
> #       the condition has length > 1 and only the first element will 
> be used
> DADOS
>
> ### solução
> sel <- complete.cases(DADOS[,1:2])
> DADOS$IDADE[sel] = round(age_calc(DADOS$NASCIMENTO[sel], 
> DADOS$DATA_FATO[sel], units = "years"), 2)
> DADOS
> # NASCIMENTO  DATA_FATO IDADE
> # 1 1997-11-26 2007-11-26 10.00
> # 2 1999-03-20 2009-04-20 10.08
> # 3       <NA> 2009-06-14    NA
> # 4 1998-05-06 2008-10-06 10.42
> # 5 2000-01-03 2010-01-13 10.03
> # 6       <NA> 2007-05-29    NA
> # 7       <NA> 2011-02-01    NA
> # 8 1997-11-28 2007-11-28 10.00
> # 9 2000-02-10 2010-02-10 10.00
> ### </code>
>
>
>
> ================================================
> Éder Comunello
> Researcher at Brazilian Agricultural Research Corporation (Embrapa)
> DSc in Agricultural Systems Engineering (USP/Esalq)
> MSc in Environ. Sciences (UEM), Agronomist (UEM)
> ---
> Embrapa Agropecuária Oeste, Dourados, MS, Brazil |<O>|
> ================================================
> GEO, -22.2752, -54.8182, 408m
> UTC-04:00 / DST: UTC-03:00
>
>
>
>
> Em 23 de junho de 2016 22:42, Amikobh via R-br 
> <r-br em listas.c3sl.ufpr.br <mailto:r-br em listas.c3sl.ufpr.br>> escreveu:
>
>     Ei! Eis os scripts e a saída de erro:
>
>     >if(!require(eeptools)){install.packages("eeptools");
>     require(eeptools)}
>
>     >banco$NASCIMENTO = as.Date(banco$NASCIMENTO, "%d/%m/%y")
>     >banco$DATA_ATO = as.Date(banco$DATA_ATO, "%d/%m/%y")
>     ## calcula o intervalo em anos
>     >banco$IDADE2 = floor(age_calc(banco$NASCIMENTO, banco$DATA_ATO,
>     units = "years"))
>
>     Error in seq.int <http://seq.int>(r1$year, to$year, by) :
>       'from' cannot be NA, NaN or infinite
>     Além disso: Warning message:
>     In if (enddate < dob) { :
>       a condição tem comprimento > 1 e somente o primeiro elemento
>     será usado
>
>     Existem linhas do banco$NASCIMENTO  vazias.
>     Quando uso os scripts sugeridos pelo Eder dá certo sendo que
>     aparece NA em banco$idade2 na correspondente que contém NA em
>     banco$NASCIMENTO...
>
>     Muito obrigado.
>
>
>     Em 22-06-2016 13:55, salah via R-br escreveu:
>>     Olá Amiko
>>
>>     É necessário que você disponibilize um trecho do seu script ou
>>     pelo menos  a saída de erro
>>     Executei o meu script e do Eder e ambos obtiveram exito
>>
>>     Na conversão de datas usando a função <as.Date()> o padrão de
>>     conversão tem que ser exatamente com o formato da data se não
>>     retorna NA
>>
>>     exemplo:
>>
>>     as.Date(c("26/11/97"), "%d/%m/%y")## padrão da data como
>>     "dia/mes/ano"
>>     ## [1] "1997-11-26"
>>
>>     as.Date(c("26/11/97"), "%d-%m-%y")## padrão da data como
>>     "dia-mes-ano"
>>     ## NA
>>
>>     usando o lubridate() como sugeriu o Eder
>>
>>     library(lubridate)
>>     dmy("26/11/97")## não é necessário um padrão, mas tem que estar
>>     como dia mes e ano
>>     ## [1] "1997-11-26"
>>
>>     dmy("26-11-97")
>>     ##[1] "1997-11-26
>>
>>     dmy("11/26/97")
>>     ## NA
>>
>>     saudações
>>
>>     Em 22/06/2016 09:28, Amiko Bh via R-br escreveu:
>>>
>>>     Prezado,
>>>
>>>     Quando executo o script para calcular o período retorna erro por
>>>     conta dos NA’S.
>>>
>>>     Obrigado pela ajuda.
>>>
>>>     Enviado do meu telefone Windows 10
>>>
>>>     *De: *salah via R-br <mailto:r-br em listas.c3sl.ufpr.br>
>>>     *Enviado:*quinta-feira, 16 de junho de 2016 23:23
>>>     *Para: *r-br em listas.c3sl.ufpr.br <mailto:r-br em listas.c3sl.ufpr.br>
>>>     *Assunto: *Re: [R-br] Operação entre datas
>>>
>>>     segue sugestão
>>>
>>>     library(eeptools)
>>>
>>>     DADOS = data.frame(
>>>             NASCIMENTO = c("26/11/97", "20/03/99",
>>>     "14/05/99","06/05/98", "03/01/00", "19/05/97", "01/02/01",
>>>     "28/11/97", "10/02/00"),
>>>             DATA_FATO = c("23/02/15", "28/03/15", "08/04/15",
>>>     "08/04/15", "08/04/15", "08/05/15", "17/05/15", "03/06/15",
>>>     "03/06/15"))
>>>
>>>     ## converter para Date
>>>     DADOS$NASCIMENTO = as.Date(DADOS$NASCIMENTO, "%d/%m/%y")
>>>     DADOS$DATA_FATO = as.Date(DADOS$DATA_FATO, "%d/%m/%y")
>>>
>>>     ## calcula o intervalo em anos
>>>     DADOS$IDADE = floor(age_calc(DADOS$NASCIMENTO, DADOS$DATA_FATO,
>>>     units = "years"))
>>>
>>>     DADOS
>>>
>>>     saudações
>>>
>>>     Em 16/06/2016 14:45, Amikobh via R-br escreveu:
>>>
>>>         Prezados,
>>>
>>>         Desde já, obrigado pela ajuda.
>>>
>>>         Tendo duas variáveis com datas referentes a determinada pessoa:
>>>
>>>         NASCIMENTO
>>>
>>>         	
>>>
>>>         DATA_FATO
>>>
>>>         26/11/97
>>>
>>>         	
>>>
>>>         23/02/15
>>>
>>>         20/03/99
>>>
>>>         	
>>>
>>>         28/03/15
>>>
>>>         14/05/99
>>>
>>>         	
>>>
>>>         08/04/15
>>>
>>>         06/05/98
>>>
>>>         	
>>>
>>>         08/04/15
>>>
>>>         03/01/00
>>>
>>>         	
>>>
>>>         08/04/15
>>>
>>>         19/05/97
>>>
>>>         	
>>>
>>>         08/05/15
>>>
>>>         01/02/01
>>>
>>>         	
>>>
>>>         17/05/15
>>>
>>>         28/11/97
>>>
>>>         	
>>>
>>>         03/06/15
>>>
>>>         10/02/00
>>>
>>>         	
>>>
>>>         03/06/15
>>>
>>>         Como procedo para criar mais uma coluna que calcula a idade
>>>         no dia da ocorrência de determinado fato? De tal forma que
>>>         obtenha:
>>>
>>>         NASCIMENTO
>>>
>>>         	
>>>
>>>         DATA_FATO
>>>
>>>         	
>>>
>>>         IDADE
>>>
>>>         26/11/97
>>>
>>>         	
>>>
>>>         23/02/15
>>>
>>>         	
>>>
>>>         17
>>>
>>>         20/03/99
>>>
>>>         	
>>>
>>>         28/03/15
>>>
>>>         	
>>>
>>>         16
>>>
>>>         14/05/99
>>>
>>>         	
>>>
>>>         08/04/15
>>>
>>>         	
>>>
>>>         15
>>>
>>>         06/05/98
>>>
>>>         	
>>>
>>>         08/04/15
>>>
>>>         	
>>>
>>>         16
>>>
>>>         03/01/00
>>>
>>>         	
>>>
>>>         08/04/15
>>>
>>>         	
>>>
>>>         15
>>>
>>>         19/05/97
>>>
>>>         	
>>>
>>>         08/05/15
>>>
>>>         	
>>>
>>>         17
>>>
>>>         01/02/01
>>>
>>>         	
>>>
>>>         17/05/15
>>>
>>>         	
>>>
>>>         14
>>>
>>>         28/11/97
>>>
>>>         	
>>>
>>>         03/06/15
>>>
>>>         	
>>>
>>>         17
>>>
>>>         10/02/00
>>>
>>>         	
>>>
>>>         03/06/15
>>>
>>>         	
>>>
>>>         15
>>>
>>>         Valeu, gente!
>>>
>>>
>>>
>>>
>>>         _______________________________________________
>>>
>>>         R-br mailing list
>>>
>>>         R-br em listas.c3sl.ufpr.br <mailto:R-br em listas.c3sl.ufpr.br>
>>>
>>>         https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>
>>>         Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.
>>>
>>>
>>>
>>>     _______________________________________________
>>>     R-br mailing list
>>>     R-br em listas.c3sl.ufpr.br <mailto:R-br em listas.c3sl.ufpr.br>
>>>     https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>     Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.
>>
>>
>>
>>     _______________________________________________
>>     R-br mailing list
>>     R-br em listas.c3sl.ufpr.br <mailto:R-br em listas.c3sl.ufpr.br>
>>     https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>     Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.
>
>
>     _______________________________________________
>     R-br mailing list
>     R-br em listas.c3sl.ufpr.br <mailto:R-br em listas.c3sl.ufpr.br>
>     https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>     Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e
>     forneça código mínimo reproduzível.
>
>

-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20160624/1fc09bb6/attachment-0001.html>


Mais detalhes sobre a lista de discussão R-br