Manipolazioni di data usando As.posixlt
Domanda
Sto cercando di localizzare la domenica più vicina ad oggi.
Definisco oggi come:
dt <- as.Date("2014-06-04")
.
Posso trovare l'ultima domenica seguendo:
dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"
.
Posso trovare la domenica successiva seguendo:
dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"
.
Non certo perché quanto segue non funziona:
ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday)
[1] 16222
.
Sto ricevendo un numero: 16222
anziché una data.
Ciascuna delle seguenti affermazioni funziona come previsto:
as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3
.
Qualche idea ??
Soluzione
Sembra che ifelse
restituisca un vettore e strisce la classe "Posix" dalle date.Perché non fare
dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday
.
invece.
Altri suggerimenti
Un'altra soluzione: ripristinare l'attributo di classe chiamando e.g.:
structure(ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday), class="Date")
. Non è necessario utilizzare un ifelse
qui, un classico if/else
farà il lavoro:
if(as.POSIXlt(dt)$wday <= 3) dt - as.POSIXlt(dt)$wday else dt + as.POSIXlt(dt)$wday
[1] "2014-06-01"
.
o addirittura più semplice:
wday <- as.POSIXlt(dt)$wday
dt + if(wday<= 3) -wday else wday
. 1) Prova questo:
wday <- as.POSIXlt(dt)$wday
dt + ifelse(wday <= 3, -wday, 7-wday)
.
Si applica il ifelse
al numero di giorni aggiunti o sottratti.ifelse
funziona bene con numeri semplici ma non con tipi complessi come la classe "Date"
, quindi questo evita l'applicazione di ifelse
a oggetti di classe "Date"
.
Nota che se wday > 3
, vogliamo aggiungere 7-wday
e non wday
(come nella domanda).
La soluzione qui continua a lavorare anche se dt
è un vettore di date.
2) Si noti che la seconda riga della risposta in (1) potrebbe essere scritta alternativamente nel modo seguente il modo in cui calcola la domenica scorsa (dt-wday
) e aggiunge 7 per ottenere la domenica successivaMercoledì passato nella settimana.
dt - wday + ifelse(wday > 3, 7, 0)
.
3) Ancora un altro modo per esprimere questo è:
dt - wday + 7 * (wday > 3)
.