为什么dplyr转换POSIXct对象

时间:2018-07-25 22:36:46

标签: r dplyr posixct

我有一个POSIXct类的日期时间对象。我需要通过增加几个小时来调整值。我知道我可以使用基本加法来做到这一点。例如,我可以像这样向POSIXct对象添加5个小时:

x <- as.POSIXct("2009-08-02 18:00:00", format="%Y-%m-%d %H:%M:%S")
x
[1] "2009-08-02 18:00:00 PDT"
x + (5*60*60)
[1] "2009-08-02 23:00:00 PDT"

现在我有一个数据帧,其中某些时间还可以,而有些情况很糟。

> df
         set_time      duration           up_time
1 2009-05-31 14:10:00        3 2009-05-31 11:10:00
2 2009-08-02 18:00:00        4 2009-08-02 23:00:00
3 2009-08-03 01:20:00        5 2009-08-03 06:20:00
4 2009-08-03 06:30:00        2 2009-08-03 11:30:00

请注意,第一个数据帧条目的“ up_time”小于“ set_time”。因此,在这种情况下,“好”时间是set_time up_time的时间。我想留下好的条目,并修复错误的条目。错误条目应通过创建等于“ set_time” +持续时间的“ up_time”来解决。我使用以下dplyr管道执行此操作:

 df1 <- tbl_df(df) %>% mutate(up_time = ifelse(set_time > up_time, set_time + 
 (duration*60*60), up_time))

df1
# A tibble: 4 x 3
set_time            duration     up_time
<dttm>                 <dbl>       <dbl>
1 2009-05-31 14:10:00       3. 1243815000.
2 2009-08-02 18:00:00       4. 1249279200.
3 2009-08-03 01:20:00       5. 1249305600.
4 2009-08-03 06:30:00       2. 1249324200.

正常运行时间已强制为数字:

> str(df1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       4 obs. of  3 variables:
$ set_time: POSIXct, format: "2009-05-31 14:10:00" "2009-08-02 18:00:00" 
"2009-08-03 01:20:00" "2009-08-03 06:30:00"
$ duration: num  3 4 5 2
$ up_time : num  1.24e+09 1.25e+09 1.25e+09 1.25e+09

我可以使用以下方法将其转换回所需的POSIXct格式:

> as.POSIXct(df1$up_time,origin="1970-01-01")
[1] "2009-05-31 17:10:00 PDT" "2009-08-02 23:00:00 PDT" "2009-08-03 06:20:00 
PDT" "2009-08-03 11:30:00 PDT"

但是我觉得这最后一步没有必要。我可以/如何避免dplyr更改变量格式?

0 个答案:

没有答案