2015-10-12 8 views
6

Rを使用して月の最後の曜日(水曜日など)を見つけるにはどうすればよいですか?以下のコードでは、月、日、週、週、曜日を計算します。 2014年1月には5つの水曜日がありますが、2014年2月の水曜日は4つしかないため、フィルタとしてmax(月)を使用することはできません。基本的なR関数を使うのが好きですが、どんな助けもありがたいです。R月の最後の平日を検索

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

目標は、それぞれの日/行のために、その月の最後の平日を与える、新しい列を作成するのですか? – Frank

答えて

6

私は、これはあなたが後にしているものだと思います。最後の平日で、特定の日付を確認するには

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

....

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

結果がどのように見えます。 ..

  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 

これを初めて実行した場合、コースあなたはlast_weekday_o_monthweekdays(last_weekdaydate_o_month)として計算することができます。カップルパッケージと


@RichardScrivenにより示唆されるように、これは、/読み出し可能、よりエレガントに行うことができます。

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

ここ

  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

私は最後の特定の曜日(例えば、その月の最後の水曜日)を見つけようとしています。たぶんあなたのコードをFUN = function(x)tail(x [!x%in%c( "Monday"、 "Tuesday"、 "Thursday"、 "Friday"、 "Saturday"、 "Sunday" 。 – user1491868

+1

@ user1491868答えを更新しました;そうですね。 – Frank

+2

'setDT(DF)[、最後(DATE [!chron :: is.weekend(DATE)])、by = month(DATE)] '役に立つかもしれない –

5

を与えるdplyrを用いる方法です。基本的には、月単位でグループ化し、「週末」の日数を除外して、最後(つまり最大)日の曜日を返します。

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

@フランク、ああ、私はすでにそれをロードしていたので、私はそれを使用すると考えて追加しました。 – 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)) 
関連する問題