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

如何防止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,但我仍然很难为我发现的令人惊讶的行为找到一个解释。


白板的微信
浏览 532回答 3
3回答

Helenr

你可以用dplyr::if_else.从…dplyr 0.5.0发布说明: "[if_else]有更严格的语义ifelse()*true和false参数必须是相同的类型。这提供了一种不太令人惊讶的返回类型,并保留S3向量,如日期" .library(dplyr)dates&nbsp;<-&nbsp;if_else(dates&nbsp;==&nbsp;'2011-01-01',&nbsp;dates&nbsp;-&nbsp;1,&nbsp;dates)str(dates)#&nbsp;Date[1:5],&nbsp;format:&nbsp; "2010-12-31"&nbsp;"2011-01-02"&nbsp;"2011-01-03"&nbsp;"2011-01-04"&nbsp;"2011-01-05"

沧海一幻觉

它与文件有关价值的ifelse:长度和属性相同的向量(包括维度和“class“)test的值和数据值。yes或no..答案的模式将被迫从逻辑上首先容纳任何从yes然后任何从no.归结到它的含意,ifelse使元素失去它们的级别和日期,失去它们的类,并且只恢复它们的模式(“数值”)。试一试:dates[dates&nbsp;==&nbsp;'2011-01-01']&nbsp;<-&nbsp;dates[dates&nbsp;==&nbsp;'2011-01-01']&nbsp;-&nbsp;1str(dates)#&nbsp;Date[1:5],&nbsp;format:&nbsp;"2010-12-31"&nbsp;"2011-01-02"&nbsp;"2011-01-03" &nbsp;"2011-01-04"&nbsp;"2011-01-05"您可以创建一个safe.ifelse:safe.ifelse&nbsp;<-&nbsp;function(cond,&nbsp;yes,&nbsp;no){&nbsp;class.y&nbsp;<-&nbsp;class(yes) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;<-&nbsp;ifelse(cond,&nbsp;yes,&nbsp;no) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class(X)&nbsp;<-&nbsp;class.y;&nbsp;return(X)}safe.ifelse(dates&nbsp;==&nbsp;'2011-01-01', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dates&nbsp;-&nbsp;1,&nbsp;dates)#&nbsp;[1]&nbsp;"2010-12-31"&nbsp;"2011-01-02"&nbsp;"2011-01-03"&nbsp;"2011-01-04"&nbsp;"2011-01-05"稍后请注意:我看到哈德利建立了一个if_else进入数据整形包的magrittr/dplyr/tidyr复合体中。
打开App,查看更多内容
随时随地看视频慕课网APP