题
我正在尝试找到距离今天最近的周日。
我把今天定义为:
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)
不隶属于 StackOverflow