2015-10-12 14 views
6

Wie finde ich den letzten Wochentag (z. B. Mittwoch) des Monats mit R? Im folgenden Code berechne ich den Monat, den Tag des Monats, die Woche des Monats und den Wochentag. Es gibt 5 Mittwochs im Januar 2014, aber nur 4 Mittwochs im Februar 2014, daher kann ich max (Woche des Monats) nicht als Filter verwenden. Jede Hilfe wird geschätzt, obwohl ich die Basis-R-Funktionen bevorzuge.R finden letzten Wochentag des Monats

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

Das Ziel ist es, eine neue Spalte zu erstellen, die für jeden Tag/Zeile, den letzten Wochentag des Monats gibt? – Frank

Antwort

6

Ich denke, das ist, was Sie nach:

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

das besondere Datum zu finden, dass der letzte Tag ist ....

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

das Ergebnis aussieht. ..

  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 

Wenn Sie dies zuerst getan haben, natürlich Sie könnten last_weekday_o_month als weekdays(last_weekdaydate_o_month) berechnen.


mit ein paar Paketen, kann dieser eleganten/leserlich gemacht werden, wie durch @RichardScriven vorgeschlagen:

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

die gibt

  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

Ich versuche den letzten bestimmten Wochentag zu finden, zum Beispiel den letzten Mittwoch des Monats. Vielleicht könnte ich Ihren Code modifizieren, um FUN = function (x) tail (x [! (X% in% c ("Montag", "Dienstag", "Donnerstag", "Freitag", "Samstag", "Sonntag") zu sagen – user1491868

+1

@ user1491868 Ich habe die Antwort aktualisiert, yeah, es ist etwas in der Art. – Frank

+2

'setDT (DF) [, letzte (DATUM [! Chron :: is.weekend (DATE)]), von = Monat (DATUM)]. 'könnte nützlich sein –

5

Hier ist ein Verfahren unter Verwendung dplyr. Im Wesentlichen gruppieren Sie nach dem Monat, filtern die "Wochenendtage" aus und geben den Wochentag des letzten (d. H. Max) Tages zurück.

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, ich hatte es gerade schon geladen, also habe ich es hinzugefügt, indem ich dachte, ich benutze es, es ist hier nicht notwendig. – 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)) 
Verwandte Themen