我正在使用该函数ifelse()来操作日期向量。我希望结果是 class Date,并惊讶地得到一个numeric向量。这是一个例子:
ifelse()
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
的帮助页面ifelse表明这是一项功能,而不是错误,但我仍在努力为我发现的令人惊讶的行为找到解释。
您可以使用data.table::fifelse( data.table >= 1.12.3) 或dplyr::if_else.
data.table::fifelse
data.table >= 1.12.3
dplyr::if_else
与 不同ifelse,fifelse保留输入的类型和类。
fifelse
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 0.5.0发行说明:
dplyr 0.5.0
[ if_else] 具有更严格的语义ifelse():true和false参数必须是相同的类型。这给出了一个不那么令人惊讶的返回类型,并保留了 S3 向量,如 日期 ” 。
if_else
true
false
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"