ifelse语句返回数字而不是日期

时间:2015-08-14 14:56:58

标签: r

我的代码中有一系列日期在ifelse语句中,它们返回单个数值而不是日期。

osa <- read.delim("C:/RMathew/RScripts/osaevents/osaevents.txt", stringsAsFactors=TRUE)
#
osa$datetime <- ymd_hms(osa$datetime)
osa$date <- as.Date(osa$datetime)
sixoclock <- 6*60*60
osa$daystart <- ymd_hms(ymd(osa$date) + sixoclock)
osa$dateplus <- osa$date + 1
osa$dateminus <- osa$date - 1
osa$dayend <- ymd_hms(ymd(osa$dateplus) + sixoclock)
osa$dateloca <- osa$datetime >= osa$daystart
osa$datelocb <- osa$datetime < osa$dayend
osa$milldate <- ifelse(osa$dateloca==TRUE & osa$datelocb==TRUE,
                       osa$date,osa$dateminus)

此数据来源的地方考虑从任何一天的上午6点到第二天的上午6点之间的时间,作为一天。上面的代码试图将日期与特定日期早上6点之后但在第二天早上6点之前的问题进行比较,以便为其分配前一天的日期(无论哪一天)。

到目前为止一切顺利,但是它返回了osa $ milldate的单个数字,而不是ifelse列中的日期。

'data.frame':   897 obs. of  16 variables:
 $ datetime : POSIXct, format: "2015-08-13 15:11:53" "2015-08-13 14:53:26" "2015-08-13 14:34:58" "2015-08-13 14:16:18" ...
 $ stream   : Factor w/ 1 level "fc": 1 1 1 1 1 1 1 1 1 1 ...
 $ fe       : num  18.1 18 17.6 18.1 18.5 ...
 $ ni       : num  2.97 2.99 2.92 3.2 3.32 ...
 $ cu       : num  3.41 3.35 2.99 3.58 3.73 ...
 $ pd       : num  138 157 139 166 183 ...
 $ mg       : num  13.8 13.8 14.4 14.3 13.9 ...
 $ so       : num  9.67 9.81 9.65 10.58 11.37 ...
 $ date     : Date, format: "2015-08-13" "2015-08-13" "2015-08-13" "2015-08-13" ...
 $ daystart : POSIXct, format: "2015-08-13 06:00:00" "2015-08-13 06:00:00" "2015-08-13 06:00:00" "2015-08-13 06:00:00" ...
 $ dateplus : Date, format: "2015-08-14" "2015-08-14" "2015-08-14" "2015-08-14" ...
 $ dateminus: Date, format: "2015-08-12" "2015-08-12" "2015-08-12" "2015-08-12" ...
 $ dayend   : POSIXct, format: "2015-08-14 06:00:00" "2015-08-14 06:00:00" "2015-08-14 06:00:00" "2015-08-14 06:00:00" ...
 $ dateloca : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ datelocb : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ milldate : num  16660 16660 16660 16660 16660 ...

思考?此外,可能有更优雅的方式来做到这一点。

1 个答案:

答案 0 :(得分:3)

请参阅ifelse

的帮助文件
  

警告:

     
    

结果的模式可能取决于'test'的值(参见          例子),以及结果的class属性(参见'oldClass')          取自'测试',可能不适合这些值          选自“是”和“否”。

         

有时候最好使用

这样的结构   
  (tmp <- yes; tmp[!test] <- no[!test]; tmp)
     
    

,可能扩展为处理'test'中的缺失值。

  

这准确描述了你的例子中发生了什么 - 日期类属性丢失 - 以及解决方法 - 多步骤方法。

osa$milldate <- osa$date
ind<- osa$dateloca==TRUE & osa$datelocb==TRUE
osa$milldate[!ind] <- osa$dateminus

另一个选项是replace