如何按顺序添加行值一定次数并填充 R 中的每一行?

How to go about adding row values in sequence a certain number of times and filling in every row in R?

我一直在尝试使用 R 来清理一些数据。我的数据集如下所示:

DateTime             Day ...
2018-10-01 10:00:00  0
2018-10-01 10:00:05  0
2018-10-01 10:00:10  0
2018-10-01 10:00:15  0
2018-10-01 10:00:20  0
2018-10-01 10:00:25  0
2018-10-01 10:00:30  0
2018-10-01 10:00:35  0

它在 5 秒 bin 中,所以 24 小时 = 17280 bin。我正在尝试添加一个 Day 列,该列基本上只给出一个从开头开始的值 1 并计算 24 小时并为第 1 天提供 '1,1,1,1,1...1''2,2,2,2,2...2'从第 2 天的 10:00:00 开始,一直到每个数据集。

所以我想要的输出看起来像这样:

DateTime             Day 
2018-10-01 10:00:00  1
2018-10-01 10:00:05  1
2018-10-01 10:00:10  1
2018-10-01 10:00:15  1
...        ...       ...
2018-10-02 9:59:50   1
2018-10-02 9:59:55   1
2018-10-02 10:00:00  2  
2018-10-02 10:00:05  2
...        ...       ...
2018-10-03 9:59:50   2
2018-10-03 9:59:55   2
2018-10-03 10:00:00  3  
2018-10-03 10:00:05  3

为此,我想出了一个代码,使用 rep():

创建一个数字向量
days<- round(nrow(df)/17280)
sdays <- rep(1:days, each = 17280, times = 1)
df$Day <- sdays

如果日期与 24 小时的长度完全匹配并且我不需要向下或向上舍入,则此方法有效。但是,并非我正在查看的每个数据集都具有完美的 24 小时日期范围,而且我不希望编辑掉数据,因为每个 bin 对于我正在查看的内容都是必需的。因此,我一直在尝试为此寻找一种更合适的方法,但收效甚微(尽管我确信它在 www 中的某个地方,因为它非常基本)。

您可以 cut() date 通过 24 hours:

数据

dat <- data.frame(
  Date = seq(ISOdatetime(2018, 10, 01, 10, 0, 0, "GMT"), 
             ISOdatetime(2018, 10, 03, 10, 0, 5, "GMT"),
             by = 5
             ))

将日期缩短 24 小时

dat$Day <- cut(dat$Date, "24 hours", F)

输出

head(dat, 4)

dat[(nrow(dat) %/% 2 - 2):(nrow(dat) %/% 2 + 1), ]

tail(dat, 4)

                 Date Day
    1 2018-10-01 10:00:00   1
    2 2018-10-01 10:00:05   1
    3 2018-10-01 10:00:10   1
    4 2018-10-01 10:00:15   1
      .......................
17279 2018-10-02 09:59:50   1
17280 2018-10-02 09:59:55   1
17281 2018-10-02 10:00:00   2
17282 2018-10-02 10:00:05   2
      .......................
34559 2018-10-03 09:59:50   2
34560 2018-10-03 09:59:55   2
34561 2018-10-03 10:00:00   3
34562 2018-10-03 10:00:05   3

只需使用简单的 difftime 计算,并四舍五入到最接近的整数..

数据

dat <- data.frame(
  Date = seq(as.POSIXct("2018-10-01 10:00:00", format = "%Y-%m-%d %H:%M:%S"), 
             as.POSIXct("2018-10-03 10:00:05", format = "%Y-%m-%d %H:%M:%S"),
             by = 5
  ))

代码

dat$day <- as.numeric( ceiling( difftime( dat$Date, dat$Date[1] - 5, units = "days") ) )

输出

#                      Date day
#     1 2018-10-01 10:00:00   1
#     2 2018-10-01 10:00:05   1
#     3 2018-10-01 10:00:10   1
#     4 2018-10-01 10:00:15   1
#     5 2018-10-01 10:00:20   1
#     6 2018-10-01 10:00:25   1 
# ....
# 17278 2018-10-02 09:59:45   1
# 17279 2018-10-02 09:59:50   1
# 17280 2018-10-02 09:59:55   1
# 17281 2018-10-02 10:00:00   2
# 17282 2018-10-02 10:00:05   2