[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