Data de manipulações usando como.POSIXlt
Pergunta
Estou tentando localizar o mais próximo domingo para hoje.
Eu defino hoje como:
dt <- as.Date("2014-06-04")
Eu posso encontrar o último domingo pelo seguinte:
dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"
Eu posso encontrar o próximo domingo pelo seguinte:
dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"
Não sei por que o seguinte não está a funcionar:
ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday)
[1] 16222
Eu estou recebendo um número: 16222
em vez de uma data.
Cada uma das seguintes afirmações funcionam conforme o esperado:
as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3
Qualquer idéias??
Solução
Parece que ifelse
retorna um vetor e tiras o "POSIX" classe a partir de suas datas.Por que não fazer
dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday
em vez disso.
Outras dicas
Outra solução:restaure o atributo de classe chamando por exemplo:
structure(ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday), class="Date")
Não é necessário usar um ifelse
aqui, Um clássico if/else
vai fazer o trabalho:
if(as.POSIXlt(dt)$wday <= 3) dt - as.POSIXlt(dt)$wday else dt + as.POSIXlt(dt)$wday
[1] "2014-06-01"
Ou ainda mais simples:
wday <- as.POSIXlt(dt)$wday
dt + if(wday<= 3) -wday else wday
1) Tente isso:
wday <- as.POSIXlt(dt)$wday
dt + ifelse(wday <= 3, -wday, 7-wday)
Isso se aplica a ifelse
para o número de dias adicionados ou subtraídos. ifelse
funciona bem com simples números, mas não com tipos complexos, como "Date"
de classe, isto evita a aplicação de ifelse
para "Date"
objetos de classe.
Observe que, se wday > 3
em seguida, queremos adicionar 7-wday
e não wday
(como na pergunta).
A solução aqui continua a funcionar mesmo se dt
é um vetor de datas.
2) Note que a segunda linha da resposta em (1) pode alternativamente ser escrito da seguinte forma, que calcula primeiro o último domingo (dt-wday
) e adiciona 7 para obter o próximo domingo, se a sua última quarta-feira na semana.
dt - wday + ifelse(wday > 3, 7, 0)
3) Ainda uma outra forma de expressar isso é:
dt - wday + 7 * (wday > 3)