如何防止ifelse()将Date对象转换为数值对象

我使用函数ifelse()来操作日期向量。我期望结果是类Date,并惊讶地得到一个数字向量。这里是一个例子:

dates <- as.Date(c('2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'))
dates <- ifelse(dates == '2011-01-01', dates - 1, dates)
str(dates)

这是特别令人惊讶的,因为在整个向量上执行操作将返回一个Date对象。

dates <- as.Date(c('2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04','2011-01-05'))
dates <- dates - 1
str(dates)

我应该使用一些其他函数来操作日期向量?如果是,什么功能?如果没有,如何强制ifelse返回一个与输入相同类型的向量?

ifelse的帮助页面表明这是一个功能,而不是一个错误,但我仍然努力找到一个解释,我发现是令人惊讶的行为。

最佳答案
你可以使用dplyr :: if_else。

dplyr 0.5.0 release notes:“[if_else]有更严格的语义ifelse():true和false参数必须是相同的类型,这会给出一个不太令人惊讶的返回类型,并保留S3向量,如日期。

library(dplyr)
dates <- if_else(dates == '2011-01-01', dates - 1, dates)
str(dates)
# Date[1:5], format: "2010-12-31" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05" 

转载注明原文:如何防止ifelse()将Date对象转换为数值对象 - 代码日志