小编典典

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

all

我正在使用该函数ifelse()来操作日期向量。我希望结果是 class Date,并惊讶地得到一个numeric向量。这是一个例子:

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)

我应该使用其他函数对Date向量进行操作吗?如果有,是什么功能?如果不是,我如何强制ifelse返回与输入相同类型的向量?

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


阅读 56

收藏
2022-06-25

共1个答案

小编典典

您可以使用data.table::fifelse( data.table >= 1.12.3) 或dplyr::if_else.


data.table::fifelse

与 不同ifelsefifelse保留输入的类型和类。

library(data.table)
dates <- fifelse(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"

dplyr::if_else

dplyr 0.5.0发行说明

[ if_else]
具有更严格的语义ifelse()truefalse参数必须是相同的类型。这给出了一个不那么令人惊讶的返回类型,并保留了 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"
2022-06-25