为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止ifell()将日期对象转换为数字对象

如何防止ifell()将日期对象转换为数字对象

白板的微信 2019-07-02 10:49:03
如何防止ifell()将日期对象转换为数字对象我正在使用这个函数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 - 1str(dates)我应该使用其他功能来操作吗?Date矢量?如果是,什么功能?如果没有,我如何强制ifelse返回与输入类型相同的向量?的帮助页ifelse这表明这是一个特性,而不是一个bug,但我仍然很难为我发现的令人惊讶的行为找到一个解释。
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

你可以用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"


查看完整回答
反对 回复 2019-07-02
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

它与文件有关价值ifelse:

长度和属性相同的向量(包括维度和“class“)test的值和数据值。yesno..答案的模式将被迫从逻辑上首先容纳任何从yes然后任何从no.

归结到它的含意,ifelse使元素失去它们的级别和日期,失去它们的类,并且只恢复它们的模式(“数值”)。试一试:

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

您可以创建一个safe.ifelse:

safe.ifelse <- function(cond, yes, no){ class.y <- class(yes)
                                  X <- ifelse(cond, yes, no)
                                  class(X) <- class.y; return(X)}safe.ifelse(dates == '2011-01-01',
                                   dates - 1, dates)# [1] "2010-12-31" "2011-01-02" "2011-01-03" "2011-01-04" "2011-01-05"

稍后请注意:我看到哈德利建立了一个if_else进入数据整形包的magrittr/dplyr/tidyr复合体中。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 502 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信