2016-06-07 23 views
2

有日期的數據幀和周我如何旗上週五天或最後一天或一個月

> head(data) 
     day weekday 
1 2016-01-01 Friday 
4 2016-01-04 Monday 
5 2016-01-05 Tuesday 
6 2016-01-06 Wednesday 
7 2016-01-07 Thursday 
8 2016-01-08 Friday 

這裏的天是代碼:

data <- data.frame(day = seq(as.Date("2014-01-01"), as.Date("2016-05-10"), "day"), 
        weekday = weekdays(seq(as.Date("2014-01-01"), as.Date("2016-05-10"), 
             "day"))) 
excludeDays <- c("Saturday", "Sunday") 
data <- subset(data, !weekdays(data$day) %in% excludeDays) #exclude weekend 

我想補充2列標記每個月的最後一個星期五和月份的最後一天,不管它在哪一天。你會怎麼做?

更具體地說: 如果日期是月份中的最後一個日期,我希望它能夠識別我的數據。例如,如果我的數據有2016年1月的日期和1月份的最後一天的日期是2016年1月20日,那麼應該標記爲本月的最後一天。同樣,我想確定一個月中的最後一個星期五,而不是日曆中的數據。

+0

任何特定的lubridate – user3022875

+0

ceiling_date返回下個月的第一天贏得」 t工作 – user3022875

+0

嘗試lubridate :: ceiling_date(x,unit =「month」) - 1 – eminik

回答

0

有了進一步的澄清並按照以下@eminik

library(data.table) 
setDT(data) 
data[, LastDayInMonth := day == max(day), by = .(year(day), month(day))] 
data[, LastFridayInMonth := weekday == "Friday" & day == max(day), 
    by = .(year(day), month(day), weekdays(day))] 

代碼註釋生產:

# show results (only relevant rows) 
data[LastDayInMonth | LastFridayInMonth == TRUE] 

      day weekday LastDayInMonth LastFridayInMonth 
1: 2016-01-29 Friday   TRUE    TRUE 
2: 2016-02-26 Friday   FALSE    TRUE 
3: 2016-02-29 Monday   TRUE    FALSE 
4: 2016-03-25 Friday   FALSE    TRUE 
5: 2016-03-31 Thursday   TRUE    FALSE 
6: 2016-04-29 Friday   TRUE    TRUE 
7: 2016-05-06 Friday   FALSE    TRUE 
8: 2016-05-10 Tuesday   TRUE    FALSE 

編輯:代碼修改帳戶的年變化由OP提出要求。

注:weekdays回報在使用名在區域的特徵向量。因此,該代碼僅適用於英文語言環境。否則,您可能必須先使用Sys.setlocale(category = "LC_ALL", locale = "English")

+0

我發現它可以在你的代碼中工作,但是我不能讓它在我的真實代碼中工作 – user3022875

+0

我得到這個警告並且一切都是錯誤在'[.data.table'(data,,':='(LastDayInMonth,數據$ BUSINESS_DATE == ...: RHS 1是長度507(大於組1的大小(46))。最後的461個元素將被丟棄。 – user3022875

+0

錯誤是,如果將日期範圍延長超過1年,則分組不起作用,並且一切都是錯誤的。將開始日期更改爲2014-01-01而不是2016-01-01,您將看到 – user3022875

0

我使用lubridate的日期計算,但因爲你在兩者之間有缺失的日子裏,我用從dplyrlead()功能來查找數據的第二天(行)。

library(lubridate) 
library(dplyr) 
my.data <- tbl_df(data) 
my.data <- my.data %>% 
    # First last day of month 
    # get the next day in the data 
    mutate(next.day = lead(day)) %>% 
    # it's month is different 
    mutate(LastDayInMonth = ifelse(month(day) != month(next.day), T, F)) %>% 
    # Now Last Friday 
    mutate(LastFridayInMonth = 
       ifelse((wday(day) == 6) & # It's a Friday 
       # Check the month of next Friday, different 
       (month(lead(day, 5)) != month(day) 
       | is.na(lead(day, 5))), T, F)) 
+0

當我做'tail(my.data)'時,我在2016-05-06的LastFridayInMonth中看到了NA,在2016-05-10看到了'LastDayInMonth'中的NA。 – Uwe

+0

這個邏輯在***另一個**星期五*** ***之後,可以用於查看特定目標。對於這種特殊情況,我們應該添加更多的邏輯來查找整個數據集中的最後一個星期五。 – pbahr

+0

該代碼被編輯爲涵蓋數據集中上個星期五的特例。 – pbahr

0
library(lubridate) 
library(dplyr) 
data%>% 
    mutate(year = year(day),month= month(day)) %>% 
    group_by(year, month) %>% 
    mutate(LastDayInMonth = max(day)==day)%>% 
    arrange(day) %>% 
    ungroup() %>% 
    group_by(year, month, weekday) %>% 
    mutate(LastWeekInMonth = row_number() == n(), 
     LastFriayInMonth = weekday =="Freitag" & LastWeekInMonth == 1) %>% 
    ungroup()%>% 
    select(day, weekday, LastDayInMonth,LastFriayInMonth) 

相同摘錄如上(%>%的過濾器(LastDayInMonth | LastFriayInMonth == TRUE)?

Source: local data frame [8 x 4] 

     day weekday LastDayInMonth LastFriayInMonth 
     (date)  (fctr)   (lgl)   (lgl) 
1 2016-01-29 Freitag   TRUE    TRUE 
2 2016-02-26 Freitag   FALSE    TRUE 
3 2016-02-29  Montag   TRUE   FALSE 
4 2016-03-25 Freitag   FALSE    TRUE 
5 2016-03-31 Donnerstag   TRUE   FALSE 
6 2016-04-29 Freitag   TRUE    TRUE 
7 2016-05-06 Freitag   FALSE    TRUE 
8 2016-05-10 Dienstag   TRUE   FALSE 
相關問題