获取星期二的向量,但如果星期二是假日,则将其替换为R中的星期三
我想找出两次约会之间的所有周二。但是如果星期二属于用户定义的假日列表,那么我会选择星期三 这段代码在我的测试中是有效的,但它非常简陋,我担心它会悄无声息地失败获取星期二的向量,但如果星期二是假日,则将其替换为R中的星期三,r,date,dayofweek,R,Date,Dayofweek,我想找出两次约会之间的所有周二。但是如果星期二属于用户定义的假日列表,那么我会选择星期三 这段代码在我的测试中是有效的,但它非常简陋,我担心它会悄无声息地失败 low.date <- "1996-01-01" high.date <- "1997-01-01" holidays = c("01-01", "07-04", "12-25") tues <- seq(as.Date(low.date), as.Date(high.date), by = 1) tues <-
low.date <- "1996-01-01"
high.date <- "1997-01-01"
holidays = c("01-01", "07-04", "12-25")
tues <- seq(as.Date(low.date), as.Date(high.date), by = 1)
tues <- subset(tues, format(tues, "%a") == "Tue")
tues <- ifelse(format(tues, "%m-%d") %in% holidays, tues + 1, tues)
tues <- as.Date(tues, origin = "1970-01-01")
基本软件包中的
low.datePOSIXlt允许您以数字的形式访问wday
,这稍微安全一些,因为不同系统的天数名称有所不同
low.date <- "1996-01-01"
high.date <- "1997-01-01"
holidays <- c("01-01", "07-04", "12-25")
all.days <- seq(as.Date(low.date), as.Date(high.date), by = "day")
# Tuesday is Day 2 of the week
all.tues <- all.days[as.POSIXlt(all.days)$wday == 2]
tues.holidays <- format(all.tues, "%m-%d") %in% holidays
all.tues[tues.holidays] <- all.tues[tues.holidays] + 1
low.date很难修改解决方案的逻辑。但是这里有一种使用wday
函数与lubridate
包不同的形式
hol_tue <- wday(tues) == 3L & format(tues, "%m-%d") %in% holidays
wday(tues)[hol_tue] <- 4
holu-tue这似乎比海报的解决方案更糟糕。它清理了一点,但我认为它不会变得更清晰。原始问题中的代码将所有日期按顺序排列,然后每天重新设置格式并进行字符串比较,以确定是否为星期二,然后重新设置每个日期的格式以确定是否为假日,并使用ifelse重新分配每天,以确定是否需要更改。很抱歉,但这样更好。它需要坚持使用海报解决方案中的“Date”
类。引入基于秒的计算尤其不可取。@Jon--+1
是我需要的技能!我知道必须有一种比“ifelse”和“re-class”更好的方法。我仍在学习用R的方式思考。我想我可以通过使用weekdays()
操作符来避免POSIX
类操作。只需一个小注释,但像这样重复使用变量tues
将使测试更加困难。如果第二次分配给tues
的任务有错误,比如说,到最后它将被覆盖两次,因此很难追溯。@G--很好。谢谢有时我认为我是在保护公羊,但在这种情况下这是荒谬的。为什么星期天开始是在维也纳?你必须从某个地方开始这一周,而我工作过的大多数公司都是用周日开始的旧时间表。标准strftime函数也将星期日计算为第0天。@Sharpie,0不是1:)这是我的观点(更新)。我不介意从星期天开始,但称之为0。POSIXlt将周二称为第二天。我不知道这在美国是怎么回事,但在欧洲,当你说一周的第二天时,你指的是星期二。我们把星期天定为1,这与大多数人的期望是一致的:一个月的第一天是1,一年的第一天是1,一月是第一个月,第一年是1。。。我不知道谁认为这是个好主意:as.POSIXlt(ymd(20080101))$year
另一种方法是wday(tues,t)==“tues”
,当你回到代码时,它更容易理解另一种编写代码的方法是wday(tues)