我想找到最近的星期天到今天。
我今天定义为:
dt <- as.Date("2014-06-04")
我可以通过以下方式找到最后一个星期天:
dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"
我可以通过以下方式找到下一个星期天:
dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"
不确定以下行为无效:
ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday)
[1] 16222
我收到一个号码:16222
而不是约会。
以下每个陈述都按预期工作:
as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3
任何想法??
答案 0 :(得分:2)
另一种解决方案:通过调用eg。:
来恢复class属性structure(ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday), class="Date")
答案 1 :(得分:1)
似乎ifelse
返回一个向量并从您的日期中删除“POSIX”类。为什么不
dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday
代替。
答案 2 :(得分:1)
此处无需使用ifelse
,经典if/else
即可完成此任务:
if(as.POSIXlt(dt)$wday <= 3) dt - as.POSIXlt(dt)$wday else dt + as.POSIXlt(dt)$wday
[1] "2014-06-01"
甚至更简单:
wday <- as.POSIXlt(dt)$wday
dt + if(wday<= 3) -wday else wday
答案 3 :(得分:1)
1)试试这个:
wday <- as.POSIXlt(dt)$wday
dt + ifelse(wday <= 3, -wday, 7-wday)
这会将ifelse
应用于添加或减去的天数。 ifelse
适用于普通数字,但不适用于"Date"
类等复杂类型,因此可避免将ifelse
应用于"Date"
类对象。
请注意,如果wday > 3
,我们要添加7-wday
而不是wday
(如问题所示)。
即使dt
是日期向量,此处的解决方案仍然有效。
2)请注意,(1)中答案的第二行可以按以下方式编写,首先计算最后一个星期日(dt-wday
)并添加7以获得下个星期天如果是本周的那个星期三。
dt - wday + ifelse(wday > 3, 7, 0)
3)另一种表达方式是:
dt - wday + 7 * (wday > 3)