我正在尝试找到距离今天最近的周日。

我把今天定义为:

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

有任何想法吗??

有帮助吗?

解决方案

看起来 ifelse 返回一个向量并从日期中删除“POSIX”类。为什么不做

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

反而。

其他提示

另一个解决方案:通过调用例如呼叫恢复类属性。:

structure(ifelse(as.POSIXlt(dt)$wday <= 3, 
       dt - as.POSIXlt(dt)$wday, 
       dt + as.POSIXlt(dt)$wday), class="Date")
.

无需使用 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

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top