Как добавить значения строки в определенное количество раз и заполнить каждую строку в R? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытался использовать 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-секундных бинах, поэтому 24 часа = 17280 бинов. Я пытаюсь добавить столбец Day, который в основном просто дает значение, начинающееся с начала как 1, и считает через 24 часа и дает '1,1,1,1,1...1' для первого дня и '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-часовые диапазоны дат, и я предпочитаю не редактировать данные, поскольку каждый блок необходим для того, что я просматриваю. Итак, я пытался найти более подходящий подход для этого, но с небольшим успехом (хотя я уверен, что он где-то в www, так как он довольно простой).

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

просто используйте простой расчет времени и округлите до ближайшего целого числа.

Данные

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
0 голосов
/ 05 ноября 2018

Вы можете 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
...