Как вставить недостающее время (в минутах) во фрейм данных? И как назначить соответствующие значения y для этого недостающего времени как NA? - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть данные, которые выглядят так:

SN  TimeStamp      MOTOR
1   1/27/20 18:00   0
2   1/27/20 18:02   1
3   1/27/20 18:04   0
4   1/27/20 18:05   1
5   1/27/20 18:08   0

Как это может выглядеть следующим образом?

SN  TimeStamp      MOTOR
1   1/27/20 18:00   0
2   1/27/20 18:01   NA
3   1/27/20 18:02   1
4   1/27/20 18:03   NA
5   1/27/20 18:04   0
6   1/27/20 18:05   1
7   1/27/20 18:06   NA
8   1/27/20 18:07   NA
9   1/27/20 18:08   0

По сути, мой вопрос заключается в том, как вставить отсутствующую метку времени и назначить соответствующие значения MOTOR как NA?

Буду благодарен, если кто-нибудь сможет помочь. Я только начал изучать R, и с утра у меня болит голова.

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Другой возможный подход заключается в использовании library(padr):

library(padr)
library(dplyr)

df %>%
  pad(interval = 'min') %>%
  mutate(SN = row_number())

Выход

  SN           TimeStamp Motor
1  1 2020-01-27 18:00:00     0
2  2 2020-01-27 18:01:00    NA
3  3 2020-01-27 18:02:00     1
4  4 2020-01-27 18:03:00    NA
5  5 2020-01-27 18:04:00     0
6  6 2020-01-27 18:05:00     1
7  7 2020-01-27 18:06:00    NA
8  8 2020-01-27 18:07:00    NA
9  9 2020-01-27 18:08:00     0

Данные

df <- data.frame(
  SN = 1:5,
  TimeStamp = as.POSIXct(c("1/27/20 18:00", "1/27/20 18:02", "1/27/20 18:04", "1/27/20 18:05", "1/27/20 18:08"), format = "%m/%d/%y %H:%M"),
  Motor = c(0,1,0,1,0)
)
1 голос
/ 19 февраля 2020

Вы можете создать фрейм данных с временной меткой, представляющей собой последовательность из минимального и максимального значений вашего исходного фрейма данных, а затем выполнить левое соединение (здесь используются dplyr и lubridate):

library(lubridate)
library(dplyr)
df_or$TimeStamp = mdy_hm(df_or$TimeStamp) # Convert TimeStamp into appropriate date format

DF <- data.frame(TimeStamp = seq(min(df_or$TimeStamp),max(df_or$TimeStamp), by = "min"))
DF %>% left_join(., df_or, by = "TimeStamp")

            TimeStamp MOTOR
1 2020-01-27 18:00:00     0
2 2020-01-27 18:01:00    NA
3 2020-01-27 18:02:00     1
4 2020-01-27 18:03:00    NA
5 2020-01-27 18:04:00     0
6 2020-01-27 18:05:00     1
7 2020-01-27 18:06:00    NA
8 2020-01-27 18:07:00    NA
9 2020-01-27 18:08:00     0

Данные

df_or <- data.frame(TimeStamp = c("1/27/20 18:00","1/27/20 18:02","1/27/20 18:04","1/27/20 18:05", "1/27/20 18:08"),
                    MOTOR = c(0,1,0,1,0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...