2015-10-12 20 views
6

Làm cách nào để tìm ngày trong tuần cuối cùng (ví dụ: Thứ Tư) của tháng bằng cách sử dụng R? Trong mã bên dưới, tôi tính tháng, ngày trong tháng, tuần trong tháng và ngày trong tuần. Có 5 thứ Tư trong tháng 1 năm 2014, nhưng chỉ 4 ngày thứ Tư trong tháng 2 năm 2014, vì vậy tôi không thể sử dụng tối đa (tuần của tháng) làm bộ lọc. Bất kỳ trợ giúp nào được đánh giá cao mặc dù tôi thích sử dụng các hàm R cơ sở.R tìm ngày cuối tuần của tháng

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

Mục đích là để tạo ra một cột mới, cho mỗi ngày/hàng, cung cấp cho các ngày trong tuần cuối cùng của tháng đó? – Frank

Trả lời

6

Tôi nghĩ rằng đây là những gì bạn đang sau:

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

Để tìm ngày đặc biệt đó là các ngày trong tuần cuối cùng ....

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

kết quả như thế nào. ..

  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 

Nếu bạn đã thực hiện điều này trước tiên, trong số e bạn có thể tính last_weekday_o_monthweekdays(last_weekdaydate_o_month).


Với một vài gói, điều này có thể được thực hiện thanh lịch hơn/readably, theo đề nghị của @RichardScriven:

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

mang đến cho

  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

Tôi đang cố tìm ngày cuối tuần cụ thể cuối cùng, ví dụ: Thứ Tư cuối cùng của tháng. Có lẽ tôi có thể sửa đổi mã của bạn để nói FUN = function (x) tail (x [! (X% trong% c ("Monday", "Tuesday", "Thursday", "Friday", "Saturday", "Sunday") – user1491868

+1

@ user1491868 Tôi đã cập nhật câu trả lời, vâng, nó giống như thế – Frank

+2

'setDT (DF) [, last (DATE [! Chron :: is.weekend (DATE)]), theo = month (DATE)] 'có thể hữu ích –

5

Đây là một phương pháp sử dụng dplyr. Về cơ bản bạn nhóm theo tháng, lọc ra các ngày 'cuối tuần' và trả lại ngày trong tuần của ngày cuối cùng (ví dụ: tối đa).

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, tôi vừa mới tải nó vì vậy tôi đã thêm nó vào suy nghĩ tôi đã sử dụng nó. Nó không cần thiết ở đây. – 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)) 
Các vấn đề liên quan