我有一个日期和星期几的数据框
> 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
我想添加两列来标记每个月的最后一个星期五和该月的最后一天,无论它是哪一天。你会怎么做?
更具体地说: 我希望它仅针对我的数据识别该日期是否是该月的最后一个日期。例如,如果我的数据的日期为 2016 年 1 月,而 1 月的最后一个日期是 1/20/2016,则应将其标记为该月的最后一天。同样,我想在我的数据中而不是日历上标识一个月中的最后一个星期五。
最佳答案
经过额外的说明并遵循 @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")
。
关于r - 如何标记上周五或最后一天或上个月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683981/