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 <[email protected] <mailto:[email protected]>> 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:[email protected]>
    *Enviado:*quinta-feira, 16 de junho de 2016 23:23
    *Para: *[email protected] <mailto:[email protected]>
    *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

        [email protected] <mailto:[email protected]>

        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
    [email protected] <mailto:[email protected]>
    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
    [email protected] <mailto:[email protected]>
    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
    [email protected] <mailto:[email protected]>
    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
[email protected]
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.

Responder a