2015-10-12 10 views
6

Come trovo l'ultimo giorno della settimana (ad es. Mercoledì) del mese utilizzando R? Nel codice seguente, calcolo il mese, il giorno del mese, la settimana del mese e il giorno della settimana. Ci sono 5 mercoledì a gennaio 2014, ma solo 4 mercoledì a febbraio 2014, quindi non posso usare max (settimana del mese) come filtro. Qualsiasi aiuto è apprezzato anche se preferisco usare le funzioni di base R.R Trova l'ultimo giorno della settimana del mese

DF <- data.frame(DATE = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), "day")) 

DF$MONTH   <- as.numeric(format(DF$DATE, "%m")) 
DF$DAY_OF_MONTH <- as.numeric(format(DF$DATE, "%d")) 
DF$WEEK_OF_MONTH <- ceiling(as.numeric(format(DF$DATE, "%d"))/7) 
DF$WEEKDAY  <- format(DF$DATE, "%A") 

DF 
+0

L'obiettivo è quello di creare una nuova colonna che, per ogni giorno/fila, dà l'ultimo giorno della settimana del mese? – Frank

risposta

6

Credo che questo è ciò che stai dopo:

DF$last_weekday_o_month <- ave( 
    weekdays(DF$DATE), 
    months(DF$DATE), 
    FUN = function(x) tail(x[ !(x %in% c("Saturday","Sunday")) ], 1) 
) 

per trovare la data particolare che è l'ultimo giorno della settimana ....

DF$last_weekdaydate_o_month <- ave( 
    DF$DATE, 
    months(DF$DATE), 
    FUN = function(x) tail(x[ !(weekdays(x) %in% c("Saturday","Sunday")) ], 1) 
) 

il risultato assomiglia. ..

  DATE last_weekday_o_month last_weekdaydate_o_month 
1 2014-01-01    Friday    2014-01-31 
2 2014-01-02    Friday    2014-01-31 
3 2014-01-03    Friday    2014-01-31 
4 2014-01-04    Friday    2014-01-31 
5 2014-01-05    Friday    2014-01-31 
6 2014-01-06    Friday    2014-01-31 
... 
360 2014-12-26   Wednesday    2014-12-31 
361 2014-12-27   Wednesday    2014-12-31 
362 2014-12-28   Wednesday    2014-12-31 
363 2014-12-29   Wednesday    2014-12-31 
364 2014-12-30   Wednesday    2014-12-31 
365 2014-12-31   Wednesday    2014-12-31 

Se hai fatto questo prima, di corso e puoi calcolare last_weekday_o_month come weekdays(last_weekdaydate_o_month).


Con un paio di pacchetti, questo può essere fatto in modo più elegante/essere letti, come suggerito da @RichardScriven:

library(data.table) 
setDT(DF)[, 
    last_weekdaydate_o_month := last(DATE[!chron::is.weekend(DATE)]) 
, by = month(DATE)] 

che dà

  DATE last_weekdaydate_o_month 
    1: 2014-01-01    2014-01-31 
    2: 2014-01-02    2014-01-31 
    3: 2014-01-03    2014-01-31 
    4: 2014-01-04    2014-01-31 
    5: 2014-01-05    2014-01-31 
---          
361: 2014-12-27    2014-12-31 
362: 2014-12-28    2014-12-31 
363: 2014-12-29    2014-12-31 
364: 2014-12-30    2014-12-31 
365: 2014-12-31    2014-12-31 
+0

Sto cercando di trovare l'ultimo giorno della settimana specifico, ad esempio l'ultimo mercoledì del mese. Forse potrei modificare il tuo codice per dire FUN = function (x) tail (x [! (X% in% c ("Monday", "Tuesday", "Thursday", "Friday", "Saturday", "Sunday") – user1491868

+1

@ user1491868 Ho aggiornato la risposta, sì, è qualcosa di simile. – Frank

+2

'setDT (DF) [, ultimo (DATA [! Chron :: is.weekend (DATE)]), per = mese (DATA)] 'potrebbe essere utile –

5

Ecco un metodo che utilizza dplyr. Essenzialmente raggruppate per mese, filtrate i giorni del "fine settimana" e restituite il giorno della settimana dell'ultimo (cioè massimo) giorno.

library(dplyr) 

DF <- data.frame(DATE = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), "day")) 

DF %>% 
    mutate(month = months(DATE), weekday = weekdays(DATE)) %>% 
    group_by(month) %>% 
    filter(!weekday %in% c("Saturday", "Sunday")) %>% 
    summarise(last_weekday = weekdays(max(DATE))) 

Source: local data frame [12 x 2] 

     month  last_weekday 
1  April   Wednesday 
2  August    Friday 
3 December   Wednesday 
4 February    Friday 
5 January    Friday 
6  July   Thursday 
7  June    Monday 
8  March    Monday 
9  May    Friday 
10 November    Friday 
11 October    Friday 
12 September    Tuesday 
+1

@Frank, ah, l'ho appena caricato, quindi l'ho aggiunto pensando di averlo usato. Non è necessario qui. – cdeterman

0
library(lubridate) 
x <- seq(as.Date("2007-12-31"), by="1 day", length.out=(Sys.Date() - as.Date("2007-12-31"))) 
library(plyr) 
df <- data.frame(date=x, year=year(x), month=month(x)) 
df[,"weekday"] <- weekdays(df[,"date"]) 
df<- df[! df[,"weekday"] %in% c("Saturday", "Sunday"),] 
df <- ddply(df, .(year, month), summarize, last=max(date))