2015-10-12 12 views
6

Jak znaleźć ostatni dzień tygodnia (np. Środę) miesiąca za pomocą R? W poniższym kodzie obliczam miesiąc, dzień miesiąca, tydzień miesiąca i dzień tygodnia. W styczniu 2014 r. Jest 5 środy, ale tylko 4 środy w lutym 2014 r., Więc nie mogę użyć maksimum (tydzień miesiąca) jako filtra. Każda pomoc jest doceniana, chociaż wolę korzystać z podstawowych funkcji R.R znaleźć ostatni dzień tygodnia miesiąca

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

Celem jest stworzenie nowej kolumny, że dla każdego dnia/rzędu, daje ostatni dzień tygodnia tego miesiąca? – Frank

Odpowiedz

6

myślę, że to jest to, co jesteś po:

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

Aby znaleźć konkretny termin, który jest ostatni dzień tygodnia ....

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

wynik wygląda. ..

  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 

Jeśli zrobiłeś to pierwszy, z cours e można obliczyć last_weekday_o_month jako weekdays(last_weekdaydate_o_month).


z kilku pakietów, można to zrobić bardziej elegancko/czytelnie, jak sugeruje @RichardScriven:

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

co daje

  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

Próbuję znaleźć ostatni określony dzień tygodnia, na przykład ostatnią środę miesiąca. Może mógłbym zmodyfikować twój kod, by powiedzieć FUN = funkcja (x) ogon (x [! (X% w% c ("poniedziałek", "wtorek", "czwartek", "piątek", "sobota", "niedziela") – user1491868

+1

@ user1491868 Zaktualizowałem odpowiedź, tak, to coś takiego. – Frank

+2

'setDT (DF) [, last (DATA [! Chron :: is.weekend (DATE)]), by = miesiąc (DATA)] 'może się przydać –

5

Oto metoda z użyciem dplyr. Zasadniczo grupujesz według miesiąca, odfiltrowuje dni "weekendowe" i zwraca dzień tygodnia ostatniego (tj. Maks.) Dnia.

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, już go załadowałem, więc dodałem go myśląc, że go użyłem. Nie jest to konieczne tutaj. – 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))