2016-06-07 2 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/20/2016, то это должно быть отмечено как последний день месяца. Точно так же я хотел бы определить последнюю пятницу месяца в моих данных не по календарю.

+0

ничего конкретного в lubridate – user3022875

+0

ceiling_date возвращает первый день следующего месяца, который выиграл» t work – 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 

Edit: Измененный код для учета изменения лет как запрошенный ОП.

Примечание:weekdays возвращает символ вектор имен в локали в использовании. Поэтому код работает только в том случае, если вы находитесь в английском языке. В противном случае вам, возможно, придется использовать Sys.setlocale(category = "LC_ALL", locale = "English").

+0

Я вижу, что он работает в вашем коде, но я не могу заставить его работать в моем реальном коде – user3022875

+0

Я получаю это предупреждение, и все ложно. В '[.data.table' (data,,': = '(LastDayInMonth, data $ BUSINESS_DATE == ...: RHS 1 - длина 507 (больше, чем размер (46) группы 1). Последние 461 элемент (ы) будут отброшены. – user3022875

+0

ошибка заключается в том, что если вы продлеваете диапазон дат более 1 года, группировка не работает, и все будет ложным. Измените дату начала на 2014-01-01 вместо 2016-01-01, и вы увидите – user3022875

0

Я использую lubridate для расчета даты, но поскольку у вас отсутствуют промежутки времени между ними, я использую функцию lead() от dplyr, чтобы найти на следующий день (строку) в данных.

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)' Я вижу 'NA' в 'LastFridayInMonth' в 2016-05-06 и в' LastDayInMonth' в 2016-05-10. – 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