Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取星期二的向量,但如果星期二是假日,则将其替换为R中的星期三_R_Date_Dayofweek - Fatal编程技术网

获取星期二的向量,但如果星期二是假日,则将其替换为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)