Operação entre datas

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!

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@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.

Bom dia, Outra sugestão com {lubridate}. ### <code r> require(lubridate) 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 = dmy(DADOS$NASCIMENTO) DADOS$DATA_FATO = dmy(DADOS$DATA_FATO) ## calcula o intervalo em anos DADOS$IDADE = as.period(interval(DADOS$NASCIMENTO, DADOS$DATA_FATO)) head(DADOS) # NASCIMENTO DATA_FATO IDADE # 1 1997-11-26 2015-02-23 17y 2m 28d 0H 0M 0S # 2 1999-03-20 2015-03-28 16y 0m 8d 0H 0M 0S # 3 1999-05-14 2015-04-08 15y 10m 25d 0H 0M 0S # 4 1998-05-06 2015-04-08 16y 11m 2d 0H 0M 0S # 5 2000-01-03 2015-04-08 15y 3m 5d 0H 0M 0S # 6 1997-05-19 2015-05-08 17y 11m 19d 0H 0M 0S DADOS$IDADE@year # [1] 17 16 15 16 15 17 14 17 15 DADOS$IDADE@month # [1] 2 0 10 11 3 11 3 6 3 ### aproximações com certa imprecisão! year(DADOS$DATA_FATO)-year(DADOS$NASCIMENTO) # [1] 18 16 16 17 15 18 14 18 15 floor((DADOS$DATA_FATO-DADOS$NASCIMENTO)/365.25) # Time differences in days # [1] 17 16 15 16 15 17 14 17 15 ### </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 16 de junho de 2016 22:23, salah via R-br <r-br@listas.c3sl.ufpr.br> escreveu:
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 listR-br@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@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.

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 Enviado:quinta-feira, 16 de junho de 2016 23:23 Para: r-br@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@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.

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@listas.c3sl.ufpr.br> *Enviado:*quinta-feira, 16 de junho de 2016 23:23 *Para: *r-br@listas.c3sl.ufpr.br <mailto:r-br@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@listas.c3sl.ufpr.br <mailto:R-br@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@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.

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 <mailto:r-br@listas.c3sl.ufpr.br> *Enviado:*quinta-feira, 16 de junho de 2016 23:23 *Para: *r-br@listas.c3sl.ufpr.br <mailto:r-br@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@listas.c3sl.ufpr.br <mailto:R-br@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@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@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.

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@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@listas.c3sl.ufpr.br> *Enviado:*quinta-feira, 16 de junho de 2016 23:23 *Para: *r-br@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@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@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@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@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.

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@listas.c3sl.ufpr.br <mailto:r-br@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@listas.c3sl.ufpr.br> *Enviado:*quinta-feira, 16 de junho de 2016 23:23 *Para: *r-br@listas.c3sl.ufpr.br <mailto:r-br@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@listas.c3sl.ufpr.br <mailto:R-br@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@listas.c3sl.ufpr.br <mailto:R-br@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@listas.c3sl.ufpr.br <mailto:R-br@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@listas.c3sl.ufpr.br <mailto:R-br@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.
participantes (4)
-
Amiko Bh
-
Amikobh
-
salah
-
Éder Comunello