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??

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top