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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top