1

I am trying to locate the nearest Sunday to today.

I define today as:

dt <- as.Date("2014-06-04")

I can find the last Sunday by following:

dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"

I can find the next Sunday by following:

dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"

Not sure why the following is not working:

ifelse(as.POSIXlt(dt)$wday <= 3, 
       dt - as.POSIXlt(dt)$wday, 
       dt + as.POSIXlt(dt)$wday)
[1] 16222

I am getting a number: 16222 instead of a date.

Each of the following statements work as expected:

as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3

Any ideas??

4

4 回答 4

2

另一种解决方案:通过调用例如恢复类属性:

structure(ifelse(as.POSIXlt(dt)$wday <= 3, 
       dt - as.POSIXlt(dt)$wday, 
       dt + as.POSIXlt(dt)$wday), class="Date")
于 2014-06-04T20:21:21.547 回答
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
于 2014-06-04T20:51:46.007 回答
1

似乎ifelse返回一个向量并从您的日期中删除“POSIX”类。为什么不做

dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday

反而。

于 2014-06-04T20:20:33.780 回答
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)
于 2014-06-05T06:23:51.440 回答