我有一个包含日期时间的数据框(在这种情况下是使用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;答案的模式将从逻辑强制进行,以便首先适应从“是”中获取的任何值,然后从“否”中获取任何值。39;
这是否意味着测试参数(boolean
)被强制但最终numeric
而不是POSIXct
?我是否只需要通过将整个POSIXct
函数包装在某个内容中来将结果强制回ifelse
?