我想创建日期时间段的运行(白天 = 早上 6 点到下午 5:59 之间,晚上 = 下午 6 点到早上 5:59 之间),这样每个后续时间段都会得到它的排名。
每个昼/夜周期可能包含任意数量的行。有时会丢失整个时间段(例如,一天的时间段后跟第二天的一天的时间段 - 那些应该得到不同的排名)。
我正在专门寻找
dplyr
解决方案或可以轻松集成到 dplyr 工作流程中的解决方案。
这里是一个数据示例:
structure(list(SubDateTime = structure(c(1555187547, 1555194755,
1555231810, 1555573511, 1555664546, 1555702679, 1555704545, 1555706119,
1555707855, 1555709640, 1555713244, 1555722752, 1555753649, 1555837869
), tzone = "UTC", class = c("POSIXct", "POSIXt"))), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -14L))
期望的输出:
SubDateTime Rank
<dttm> <dbl>
1 2019-04-13 20:32:27 1
2 2019-04-13 22:32:35 1
3 2019-04-14 08:50:10 2
4 2019-04-18 07:45:11 3
5 2019-04-19 09:02:26 4
6 2019-04-19 19:37:59 5
7 2019-04-19 20:09:05 5
8 2019-04-19 20:35:19 5
9 2019-04-19 21:04:15 5
10 2019-04-19 21:34:00 5
11 2019-04-19 22:34:04 5
12 2019-04-20 01:12:32 5
13 2019-04-20 09:47:29 6
14 2019-04-21 09:11:09 7
你可以试试
library(dplyr)
library(data.table)
df %>%
mutate(Rank = rleid(floor((as.numeric(SubDateTime) - 21600)/43200)))
SubDateTime key
<dttm> <int>
1 2019-04-13 20:32:27 1
2 2019-04-13 22:32:35 1
3 2019-04-14 08:50:10 2
4 2019-04-18 07:45:11 3
5 2019-04-19 09:02:26 4
6 2019-04-19 19:37:59 5
7 2019-04-19 20:09:05 5
8 2019-04-19 20:35:19 5
9 2019-04-19 21:04:15 5
10 2019-04-19 21:34:00 5
11 2019-04-19 22:34:04 5
12 2019-04-20 01:12:32 5
13 2019-04-20 09:47:29 6
14 2019-04-21 09:11:09 7