gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:24:52 26 4
gpt4 key购买 nike

我正在使用函数 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 的帮助页面表明这是一个功能,而不是一个错误,但我仍在努力寻找对我发现的令人惊讶的行为的解释。

最佳答案

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

<小时/>

data.table::fifelse

Unlike ifelse, fifelse preserves the type and class of the inputs.

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 release notes :

[if_else] have stricter semantics that ifelse(): the true and false arguments must be the same type. This gives a less surprising return type, and preserves S3 vectors like dates" .

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"

关于r - 如何防止 ifelse() 将 Date 对象转换为数字对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com