ifelse()是否将日期时间强制为数字?

时间:2017-08-22 05:12:21

标签: r datetime

我有一个包含日期时间的数据框(在这种情况下是使用lubridate生成的,但我不认为这里有相关内容)并且提取了一些dt组件。然后我想有条件地改变日期时间并重新提取这些组件。

> library(tidyverse)
> library(magrittr)
> library(lubridate)
> df = data_frame(
    dt.utc = dts,
    date.utc = date(dt.utc),
    hour.utc = hour(dt.utc))
# A tibble: 20 x 3
                dt.utc   date.utc hour.utc
                <dttm>     <date>    <int>
 1 2017-01-01 01:00:00 2017-01-01        1
 2 2017-01-02 02:00:00 2017-01-02        2
 3 2017-01-03 03:00:00 2017-01-03        3
 4 2017-01-04 04:00:00 2017-01-04        4
 5 2017-01-05 05:00:00 2017-01-05        5
 6 2017-01-06 06:00:00 2017-01-06        6
 7 2017-01-07 07:00:00 2017-01-07        7
 8 2017-01-08 08:00:00 2017-01-08        8
 9 2017-01-09 09:00:00 2017-01-09        9
10 2017-01-10 10:00:00 2017-01-10       10
11 2017-01-11 11:00:00 2017-01-11       11
12 2017-01-12 12:00:00 2017-01-12       12
13 2017-01-13 13:00:00 2017-01-13       13
14 2017-01-14 14:00:00 2017-01-14       14
15 2017-01-15 15:00:00 2017-01-15       15
16 2017-01-16 16:00:00 2017-01-16       16
17 2017-01-17 17:00:00 2017-01-17       17
18 2017-01-18 18:00:00 2017-01-18       18
19 2017-01-19 19:00:00 2017-01-19       19
20 2017-01-20 20:00:00 2017-01-20       20

如果我使用replace(),我遇到的问题是替换项目必须与替换项目一样大(而不是与原始日期时间一样大)。因此,我使用ifelse()

> df %<>%
  mutate(
    dt.new = ifelse(
      hour.utc %% 2 == 1 & date.utc > '2017-01-10',
      dt.utc + hours(1),
      dt.utc))

这正确地结合了dt.utc及其修改版本。但它带来了一个意想不到的问题:ifelse似乎在结果中将结果强制转移到numeric

> df
# A tibble: 20 x 4
                dt.utc   date.utc hour.utc     dt.new
                <dttm>     <date>    <int>      <dbl>
 1 2017-01-01 01:00:00 2017-01-01        1 1483232400
 2 2017-01-02 02:00:00 2017-01-02        2 1483322400
 3 2017-01-03 03:00:00 2017-01-03        3 1483412400
 4 2017-01-04 04:00:00 2017-01-04        4 1483502400
 5 2017-01-05 05:00:00 2017-01-05        5 1483592400
 6 2017-01-06 06:00:00 2017-01-06        6 1483682400
 7 2017-01-07 07:00:00 2017-01-07        7 1483772400
 8 2017-01-08 08:00:00 2017-01-08        8 1483862400
 9 2017-01-09 09:00:00 2017-01-09        9 1483952400
10 2017-01-10 10:00:00 2017-01-10       10 1484042400
11 2017-01-11 11:00:00 2017-01-11       11 1484136000
12 2017-01-12 12:00:00 2017-01-12       12 1484222400
13 2017-01-13 13:00:00 2017-01-13       13 1484316000
14 2017-01-14 14:00:00 2017-01-14       14 1484402400
15 2017-01-15 15:00:00 2017-01-15       15 1484496000
16 2017-01-16 16:00:00 2017-01-16       16 1484582400
17 2017-01-17 17:00:00 2017-01-17       17 1484676000
18 2017-01-18 18:00:00 2017-01-18       18 1484762400
19 2017-01-19 19:00:00 2017-01-19       19 1484856000
20 2017-01-20 20:00:00 2017-01-20       20 1484942400

在组合发生之前似乎没有,因为将ifelse中的第二个和第三个参数包含在ymd_hms或类似内容中并不会影响结果。

the ifelse documentation中可能有一条线索:&#39;答案的模式将从逻辑强制进行,以便首先适应从“是”中获取的任何值,然后从“否”中获取任何值。

这是否意味着测试参数(boolean)被强制但最终numeric而不是POSIXct?我是否只需要通过将整个POSIXct函数包装在某个内容中来将结果强制回ifelse

0 个答案:

没有答案