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

Éder Comunello comunello.eder em gmail.com
Sexta Junho 24 09:41:17 BRT 2016


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(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>
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(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 <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
> *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
>
> 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 listR-br em listas.c3sl.ufpr.brhttps://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 listR-br em listas.c3sl.ufpr.brhttps://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
> 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/bc2fa6c4/attachment.html>


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